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)?

4voto

John Punkte 5461

Wenn Sie APIs verwenden, die unter XP nicht verfügbar sind, müssen Sie Ihre Anwendung in einen Lader und die eigentliche Anwendung (oder einen Lader und eine DLL, die die eigentliche Anwendung enthält) aufteilen. Kompilieren Sie den Lader mit #define _WIN32WINNT 0x0501 um sicherzustellen, dass es unter XP ausgeführt werden kann und Ihr Popup anzeigt.

Prüfen Sie die Version mit VerifyVersionInfo oder GetVersionEx

3voto

K-ballo Punkte 79342

Um eine Popup-Meldung anzuzeigen, müssen Sie die ausführbare Datei ausführen. Das bedeutet, dass Sie Ihre Windows-Version auf die niedrigste Version reduzieren müssen, die Sie "unterstützen" wollen (unterstützen bedeutet hier, in der Lage zu sein, sie auszuführen, und eine Popup-Meldung anzuzeigen, die besagt, dass sie nicht ausgeführt werden kann). Das würde voraussetzen, dass Sie den Punkt, an dem Sie Ihre relevanten DLLs verlinken, hinauszögern, da sie sonst nicht gefunden werden und Sie immer noch das gleiche Meldungsfenster erhalten würden, das Sie kennen.

Alles in allem hat dieser Ansatz zahlreiche Nachteile, da Sie sowohl unter XP als auch unter Vista eine gültige ausführbare Datei erstellen müssen. Wenn Sie diese Prüfung wirklich benötigen, könnten Sie eine ausführbare Datei damit beauftragen und entscheiden, ob eine Popup-Meldung angezeigt oder Ihre eigentliche Anwendung (in einer anderen ausführbaren Datei) gestartet werden soll.

2voto

i_am_jorf Punkte 52346

Sie könnten eine sehr kleine Wrapper-Anwendung schreiben, die _WIN32_WINNT als 0x0501 definiert. Dann kann dieses Programm eine Betriebssystemprüfung durchführen und entweder eine nette Benutzeroberfläche für den Benutzer anzeigen (wenn es sich um die falsche Version von Windows handelt) oder einfach still und leise Ihre andere ausführbare Datei starten (wenn es sich um eine unterstützte Version von Windows handelt).

Im Idealfall würde Ihr Vertriebskanal (Website usw.) prüfen, ob der Benutzer eine unterstützte Windows-Version hat, bevor er das Herunterladen zulässt.

Wenn Sie WiX (oder MSI direkt) zur Installation Ihrer Anwendung verwenden, können Sie das Installationsprogramm die Prüfung auf nicht unterstützte Betriebssysteme durchführen lassen.

1voto

Remus Rusanu Punkte 280155

Sie können kein dynamisches Laufzeitverhalten erwarten, wenn Sie ein statisches Kompilierzeitverhalten erzwingen. Sie müssen die XP-Windows-Version so definieren, dass Ihre Exe mit den XP-DLLs verknüpft wird, und dann müssen Sie zur Laufzeit das Verhalten dynamisch ändern und die Vista-DLLs laden und die Einstiegspunkte "von Hand" finden. Das ist, wie Sie sich denken können, mühsam und fehleranfällig. Viel Glück!

1voto

David Heffernan Punkte 585606

Sie können definieren _WIN32_WINNT auf einen niedrigeren Wert, der für 2000 oder XP geeignet ist. Aber dann müssen Sie explizite Verknüpfung für Vista nur APIs verwenden. Ändern von _WIN32_WINNT führt auch zu fehlenden Typdeklarationen für die Vista only APIs. Wenn Sie also wissen, welche APIs Sie benötigen, können Sie die _WIN32_WINNT unter 0x0600 und verwenden Sie explizite Verknüpfungen für diese APIs. Natürlich bräuchten Sie auch eine Versionskontrolle, um dem Benutzer eine hilfreiche Meldung zu geben.

Ich persönlich würde einen anderen Weg wählen, um dieses Problem zu lösen. Ich würde die Version bei der Installation überprüfen und sie dort blockieren. Das erlaubt es Ihnen, weiterzumachen mit _WIN32_WINNT 0x0600 und alle Annehmlichkeiten, die das mit sich bringt.

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