Zum Inhalt springen

Windows Version über WinAPI ermitteln


pp_coder

Empfohlene Beiträge

Hallo zusammen,

ich muss die Windows-Version in meinem Programm ermitteln. Das Problem an den üblichen Verdächtigen wie GetVersionEx() oder dem Auslesen des Registry-Eintrages

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ist, dass dabei für den Fall, dass die Anwendung im Kompatibilitätsmodus gestartet wurde, als Ergebnis die Version geliefert wird, indem das Programm gerade ausgeführt wird.

Beispiel:

OS ist W7 64Bit Prof.

in oben genannten Registry-Key steht: 6.1 (was ja auch Win7 entspricht)

-> Lese ich diesen Key allerdings in meinem Program aus, das im Kompatibilitätsmodus gestartet wurden, bekomme ich entsprechend andere Werte.

Die Ergebnisse von GetVersionEx verhalten sich genau so.

Kennt einer eine Möglichkeit, die "echte" Windows-Version sicher zu bestimmen?

Oder. was mir auch weiterhelfen würde:

Gibt es eine Möglichkeit festzustellen, ob die Anwendung im Kompatibilitätsmodus gestartet wurde?

Ich kann in meinem Programm die WinAPI und QT 4 nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich implementiere zur Zeit eine Installation. Ich brauche eine genaue Versionsbestimmung, da

  1. ich mittels IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE) prüfe, ob der SSE2 Befehlssatz vom Prozessor unterstützt wird, und diese Abfrage unter W2k immer false liefert. Die Software, die meine Installation installiert, braucht aber dieses Prozessorfeature, deshalb darf ich nicht installieren, wenn das Feature nicht verfügbar ist. Somit muss ich definitiv wissen, ob meine Exe unter W2k ausgeführt wird.


  2. die Software die meine Installation installieren soll, nur für bestimmte OS-Versionen qualitätsgesichert ist, und ich deshalb eine Meldung bringen muss, wenn versucht wird, die Installation unter einem nicht unterstützten OS anzuwerfen.


  3. ich für den Fall, dass bei der Installation auf Fehler auftritt, ein Log-File erzeuge. Es ist zwar nicht "überlebenswichtig", die richtige OS-Version ins Log zu schreiben, aber es wäre dennoch nicht schlecht für die eigene QS. (Da ich auch die C-Runtime-Dlls mit kopiere + modifiziertes Manifest kann unter verschiedenen OS durchaus mal was schief laufen)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich mittels IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE) prüfe, ob der SSE2 Befehlssatz vom Prozessor unterstützt wird, und diese Abfrage unter W2k immer false liefert. Die Software, die meine Installation installiert, braucht aber dieses Prozessorfeature, deshalb darf ich nicht installieren, wenn das Feature nicht verfügbar ist. Somit muss ich definitiv wissen, ob meine Exe unter W2k ausgeführt wird.
Aber was hast du von dieser Information? Du weißt dann immer noch nicht, ob SSE2 verfügbar ist, außer du hast einen anderen Mechanismus, um das zu erkennen. Aber dann könntest du diesen auch gleich anwenden.

die Software die meine Installation installieren soll, nur für bestimmte OS-Versionen qualitätsgesichert ist, und ich deshalb eine Meldung bringen muss, wenn versucht wird, die Installation unter einem nicht unterstützten OS anzuwerfen.
Das heißt (beispielsweise), die Software ist für den Win95-Kompatibilitätsmodus von XP geprüft, aber nicht für Windows 95 selbst?

ich für den Fall, dass bei der Installation auf Fehler auftritt, ein Log-File erzeuge. Es ist zwar nicht "überlebenswichtig", die richtige OS-Version ins Log zu schreiben, aber es wäre dennoch nicht schlecht für die eigene QS. (Da ich auch die C-Runtime-Dlls mit kopiere + modifiziertes Manifest kann unter verschiedenen OS durchaus mal was schief laufen)
Da würde ich doch eher die Versionsnummern relevanter System-DLLs ins Log schreiben. Die Betriebssystem-Version ist eine ziemlich schwammige Größe.

Wenn es denn unbedingt sein muss, würde ich so vorgehen, wie es hier vorgeschlagen wurde, also der Reihe nach die Verfügbarkeit von APIs prüfen, die erst in späteren OS-Versionen hinzugekommen sind.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber was hast du von dieser Information? Du weißt dann immer noch nicht, ob SSE2 verfügbar ist, außer du hast einen anderen Mechanismus, um das zu erkennen. Aber dann könntest du diesen auch gleich anwenden.

Stimmt, aber ich kann dem User eine konkrete Fehlermeldung bieten. Wäre ja blöd, wenn ich dem Benutzer mitteilen würde, dass er das falsche OS hat, aber in Wirklichkeit einen zu alten Prozessor, oder umgekehrt.

Das heißt (beispielsweise), die Software ist für den Win95-Kompatibilitätsmodus von XP geprüft, aber nicht für Windows 95 selbst?

Nein, wenn der User ein aktuelles OS hat, aber trotzdem die Anwendungen im Win95-Kompatibilitätsmodus ausführt, ist er ja selbst schuld. Aber installieren darf ich halt nur, wenn das verwendete OS >= dem Minimum-OS ist.

Da würde ich doch eher die Versionsnummern relevanter System-DLLs ins Log schreiben. Die Betriebssystem-Version ist eine ziemlich schwammige Größe.

Ja, ich befürchte so muss ich es machen. Aber echt komisch, dass man nicht einfach an die Echte OS-Version kommt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich implementiere zur Zeit eine Installation. Ich brauche eine genaue Versionsbestimmung,

Selber Installer schreiben?

Uhh.. meinst Du nicht, einen bestehen Installer zu benutzen wäre auch ok?

Für NSIS gibt's das: CPUDesc plug-in - NSIS

Bei InnoSetup kann man DLLs einbinden ("CPU Features prüfen" Dlls findet sich öfter)

Bei MSI/Wix müsst ich suchen, was sich da anbietet.

Und die Windowsversion können alle auslesen.

(Das mit dem Herausfinden ob's im Kompatibilitätsmodus ausgeführt wird:

Man könnte die Version der kernel32.dll prüfen - ist nun wirklich nicht interessant. )

Grüße Ripper

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Software, die meine Installation installiert, braucht aber dieses Prozessorfeature,

Den unterstützen Befehlssatz kann man auch anders herausfinden. Gute Programme überprüfen dies zusätzlich zur Laufzeit.

[*]die Software die meine Installation installieren soll, nur für bestimmte OS-Versionen qualitätsgesichert ist, und ich deshalb eine Meldung bringen muss, wenn versucht wird, die Installation unter einem nicht unterstützten OS anzuwerfen.

Wer den Installer in einem Kompatibilitätsmodus ausführt, der eine andere OS-Version zurückgibt, bekommt eben eine Warnung. Wo ist das Problem?

Warum verwendest Du eigentlich nicht den Windows Installer, sondern programmierst einen eigenen Installer?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Warum verwendest Du eigentlich nicht den Windows Installer, sondern programmierst einen eigenen Installer?

Mache ich ja auch, allerdings nur im Hintergrund. Der Benutzer kann über meine Setup.exe die einzelnen Produkte zum Installieren/Deinstallieren auswählen.

Das eigentliche Installieren bzw. Deinstallieren erfolgt dann schon über MSI-Pakete. Meine Exe startet diese mittels msiexec.

Allerdings prüfen die Pakete selbst keine Abhängigkeiten und keine OS-Versionen, das muss alles meine Exe leisten

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Allerdings prüfen die Pakete selbst keine Abhängigkeiten und keine OS-Versionen, das muss alles meine Exe leisten

Und warum soll sie nicht die dokumentierten Methoden zur OS Versionsabfrage nutzen, sonderm erkennen können, ob ein Kompatibilitätsmodus beim Aufruf dieser EXE aktiviert ist? Immerhin ist dies reichlich unwahrscheinlich (und falls doch, vom Benutzer vermutlich auch so beabsichtigt).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...