pp_coder Geschrieben 15. Januar 2010 Teilen Geschrieben 15. Januar 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 18. Januar 2010 Teilen Geschrieben 18. Januar 2010 Mh.. try this: Version Checking (Just Don?t Do It) - Windows 7 for Developers - The Windows Blog Grüße Ripper Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pp_coder Geschrieben 18. Januar 2010 Autor Teilen Geschrieben 18. Januar 2010 @Ripper: Danke für den interessanten Link, aber leider hilft mir das nicht wirklich weiter. Ich muss einfach definitiv wissen, unter welchem OS die Anwendung gerade läuft. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Januar 2010 Teilen Geschrieben 18. Januar 2010 Ich muss einfach definitiv wissen, unter welchem OS die Anwendung gerade läuft.Sag doch mal, wieso. Vielleicht gibt es ja einen anderen Weg, das zu tun, was du mit der genauen Versionsbestimmung erreichen willst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pp_coder Geschrieben 18. Januar 2010 Autor Teilen Geschrieben 18. Januar 2010 Ich implementiere zur Zeit eine Installation. Ich brauche eine genaue Versionsbestimmung, da 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.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.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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Januar 2010 Teilen Geschrieben 18. Januar 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pp_coder Geschrieben 18. Januar 2010 Autor Teilen Geschrieben 18. Januar 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RipperFox Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 19. Januar 2010 Teilen Geschrieben 19. Januar 2010 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pp_coder Geschrieben 30. Januar 2010 Autor Teilen Geschrieben 30. Januar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 8. Februar 2010 Teilen Geschrieben 8. Februar 2010 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). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.