AW: Info-Fenster von Windows anzeigen
Zitat:
Code:
Also wenn mich mein Delphi-Foo nicht ganz verlassen hat, sollte das in etwa so aussehen:
NTSTATUS
NTAPI RtlGetVersion( LPOSVERSIONINFOEXW lpVersionInformation );
Delphi-Quellcode:
Da gibt's dann die ehrliche Version auch ohne Manifest.
type
NTSTATUS = LONG; // oder JwaWinType.pas // JwaWinNT.pas hat OSVERSIONINFOEXW ... und nein, es ist kein Schreibfehler daß es die W-Version ist function RtlGetVersion(var osvix: OSVERSIONINFOEXW): NTSTATUS; stdcall; // Nicht vergessen dwOSVersionInfoSize auszufüllen vor dem Aufruf!!! |
AW: Info-Fenster von Windows anzeigen
Zitat:
Programme ab Windows XP dürfen sich aussuchen welche Version der Common Controls sie benutzen. Auch das wird über das Manifest gesteuert. Im Grunde besagt das Manifest also: Hör mal, ich weiß bescheid über die Eigenheiten von Windows X.Y, keine Notwendigkeit mir was vorzugaukeln. Dementsprechend sollte so ein Programm dann aber auch über High-DPI und andere moderne Funktionen bescheid wissen und sich entsprechend verhalten. Raymond Chen hat schon vor langer Zeit darüber geschrieben warum die Versionsabfragen unheimlich kompliziert sind und warum neuere Windowsversionen schummeln müssen. Viele ältere Programme haben nämlich selten dämliche Versionsprüfungen eingebaut (so nach dem Motto: Hauptversion >=5 und Unterversion >=1 ... und dann meinen man hätte alle Windowsversionen ab XP abgedeckt). Daher auch die neueren Funktionen ala VerifyVersionInfo. Da aber ältere Programme sich nicht verändern und damit auch kein Manifest bekommen werden in dem steht "ick kenn mir aus mit Windows 10, wa?!", funktioniert die von MS beabsichtigte Methode zur Rückwärtskompatibilität erstaunlich gut. |
AW: Info-Fenster von Windows anzeigen
Zitat:
Viele haben einfach wie Assarbad schrieb auf >= Version XY geprüft, viele aber auch auf Majorversion = 5 usw. Dadurch liefen viele Programme nur durch die Versionsprüfung nicht unter neueren Versionen von Windows und andere ließen sich starten, funktionierten aber nicht. Die einzig sinnvolle Versionsprüfung wäre auf das Feature zu prüfen, das man benötigt. Denn wenn man etwas verwendet, das in einer neueren Version nicht mehr drin ist, hilft es nix, dass die Version >= Version XY ist... Und umgekehrt wurden auch schon Features per Update zur Verfügung gestellt, z.B. einiges in XP SP3. Anwendungen, die auf die Windowsversion prüfen, würden dann aber nicht funktionieren obwohl das Feature dort dann doch verfügbar ist. Durch die Angabe im Manifest für welche Version eine Anwendung entwickelt wurde, kann Windows nun spezifische Kompatibilitätsoptionen automatisch anwenden, weil es weiß was es in der Version gab. |
AW: Info-Fenster von Windows anzeigen
Zitat:
|
AW: Info-Fenster von Windows anzeigen
Aus diesen Gründen (einfach+zuverlässig, auch in Zukunft, egal was MS irgendwann mal wieder anstellt) verwende ich zur Windows-Versions-Bestimmung die FileInfo aus der kernel32.dll. Dazu brauchst du weder COM, Manifest, Win-API oder sonst welches Gedöns.
|
AW: Info-Fenster von Windows anzeigen
Na dann viel Erfolg. Falls dein Programm wirklich so supercool sein sollte, kannst du vermutlich allerlei anstellen und MS wird sich danach bemühen die Kompatibilität zu neueren Windowsversionen für dich zu gewährleisten. So wie sie es auch in der Vergangenheit machten. Ansonsten fällst du unter Umständen durch's Raster. Aber das ist schließlich deine Sache, denn du verläßt dich auf etwas zu dem MS keinen Vertrag abgeschlossen hat. Die API hingegen ist ein Vertrag auf den du dich verlassen kannst. Kurzum: du trägst das volle Risiko.
Im übrigen bist du mit deiner Methode dann wieder bei händischen Versionsüberprüfungen ala (Hauptversion >=5 und Unterversion >=1). Ich will nicht anzweifeln, daß du es richtig hinbekommen kannst, aber können und machen sind zwei verschiedene Handschuhe. Die von jaenicke vorgeschlagene Methode ist aber in jedem Fall überlegen, da sie darauf abzielt, daß das Programm ermittelt welche Funktionen in der Laufzeitumgebung bereitstehen und sich dementsprechend verhält. Das hat auch nix mit COM per-se zu tun, sondern COM funktioniert nach diesem Blackbox-Prinzip. Will heißen wenn du eine GUID/CLSID hast dann kannste dich darauf verlassen, daß wenn du das Interface instanziieren kannst, es auch da ist. |
AW: Info-Fenster von Windows anzeigen
Zitat:
Eben weil durch die Umgehung der offiziellen Wege genau die genannten Probleme weiter da sind. Durch dieses Gefrickel durch diverse Programmierer ist der ganze Kompatibilitätslayer ja nur so kompliziert. Wenn du natürlich nur einen Notepad-Klon schreibst, ist die Wahrscheinlichkeit, dass du ein bestimmtes Feature brauchst, nicht so hoch. Da braucht man aber eigentlich auch keine Versionsinfo-Prüfung. Aber bei allen etwas komplexeren Projekten sollte man das ganze schon sauber lösen. Die Featureprüfung geht natürlich auch bezogen auf API-Funktionen. Wenn ich eine bestimmte API-Funktion brauche, schaue ich einfach nach, ob diese da ist. Fehlt diese in früheren oder zukünftigen Windowsversionen, weiß ich, dass mein Programm dort definitiv nicht funktioniert und kann das auch so dem Benutzer anzeigen. |
AW: Info-Fenster von Windows anzeigen
Hab's mir schon gedacht, dass ihr diese Vorgehensweise "zerlegt". Fakt ist aber, dass die Fileinfo Bestandteil des PE-Aufbaus ist und sich in zig Jahren nicht geändert hat und sich wohl zukünftig auch nicht ändern wird, denn sonst würde man alles abschießen, was es mal vorher gegeben hat. Und darum ist die Fileinfo eine zukunftsfähige Lösung. Auch wenn Windows wieder mal an der API rum schrauben sollte. Dann gehen nämlich z.B. die Manifeste wieder genauso den Bach runter, wie beim Wechsel von 8.0 zu 8.1.
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Wenn alle das nur in einem Info-Fenster anzeigen würden und sich nen Kullerkeks drüber freuen würden, wäre das ja kein Problem. Problematisch wird es wie gesagt, wenn auf dem Wege versucht wird festzustellen, ob das eigene Programm unter der Windowsversion läuft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz