4 Stimmen

c++ win32 verhindert die Ausführung von Anwendungen unter Windows xp

Ich habe eine Anwendung entwickelt, die Vista (oder höher) API's verwendet, und ich möchte eine Popup-Meldung hinzufügen, wenn die Anwendung ein nicht unterstütztes Betriebssystem erkennt.

Ich würde gerne eine Popup-Meldung hinzufügen, wenn ein Benutzer meine Anwendung unter Windows XP ausführt. Derzeit wirft die Anwendung nur ein Popup (messageBox) sagen, dass einige DLLs nicht geladen werden können.

Ich habe die Windows-Version wie folgt definiert:

 #define _WIN32_WINNT 0x0600

Was muss ich tun, um zu verhindern, dass das Programm auf Versionen unterhalb von Vista läuft? Muss ich die Betriebssystemversion prüfen, wenn die Anwendung startet (und dem Benutzer eine Meldung anzeigen)?

1voto

Dave Rager Punkte 7737

Die DLLs werden vom Anwendungslader geladen, und die Fehlermeldungen werden angezeigt, bevor Ihre Anwendung überhaupt gestartet wird. Sie müssen dies verhindern.

Sie könnten Ihre Anwendung in eine DLL packen und ein Stub-Programm erstellen, das die OS-Prüfung durchführt, wie Mystical in seiner Antwort beschreibt.

E

Es scheint, dass Mystical seine Antwort gelöscht hat... Machen Sie etwas in dieser Art:

OSVERSIONINFO OSversion;

OSversion.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
::GetVersionEx(&OSversion);

switch(OSversion.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
   if(OSversion.dwMajorVersion >= 6)
   {
      // Yay, load the DLL and call entry point
   }
default:
      // Show unsupported OS message
}

Sie können anrufen LoadLibrary() um Ihre Anwendungs-DLL zu laden und dann den von Ihnen definierten Einstiegspunkt darin aufzurufen.

N diese Antwort hat eine tolle Liste mit Versionsnummern von Betriebssystemen.

0voto

Remy Lebeau Punkte 498719

Ich weiß nicht, wie man das in Visual Studio oder anderen Compilern macht, aber in den IDEs von Borland/CodeGear/Embarcadero gibt es eine Option, um die minimale unterstützte Betriebssystemversion im PE-Header der kompilierten ausführbaren Datei festzulegen. Wenn der OS-Loader versucht, eine ausführbare Datei mit einer inkompatiblen Version auszuführen, wird die Datei nicht ausgeführt und der Benutzer erhält eine Fehlermeldung über die Versionsinkongruenz. Prüfen Sie, ob Ihr Compiler/IDE über eine ähnliche Option verfügt.

Andernfalls müssen Sie die gewünschten APIs zur Laufzeit dynamisch laden über LoadLibrary() / GetModuleHandle() y GetProcAddress() anstatt sie zur Kompilierzeit statisch zu verlinken. Dann können Sie in Ihrem Code Ihre eigenen Betriebssystemversionsprüfungen durchführen, bevor Sie neuere API-Funktionen verwenden, die möglicherweise nicht verfügbar sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X