AW: OS Version Windows 10 ermitteln.
Vielleicht hilft Dir ja diese API weiter.
|
AW: OS Version Windows 10 ermitteln.
Was für ein Stress mit Manifests, Registry und zig verschiedenen API Calls...
In der VersionInfo Resource der "kernel" oder "user" DLL steht seit Win2000 bis heute incl. aller ServicePacks dazwischen stets die reale&richtige OS Version drin. Wer einfach wissen will, welches OS läuft liest das ganz ohne "simulierte" Werte dort aus und macht damit, was immer er will. |
AW: OS Version Windows 10 ermitteln.
Zitat:
|
AW: OS Version Windows 10 ermitteln.
Zitat:
Das Auslesen von Versionsinfos ... zu finden in der CodeLib, bei Luckie, in Goggle usw. Und wollen wir hoffen, dass kernel32.ddl (x86) und kernel32.dll (x64) gleich Versioniert sind. |
AW: OS Version Windows 10 ermitteln.
Also ich kann noch die DSiWin32.pas empfehlen. Dort gibt es die DSiGetWindowsVersion()-Funktion. Wird auch in der OmniThreadLibrary verwendet.
|
AW: OS Version Windows 10 ermitteln.
Zitat:
Delphi-Quellcode:
und die holt sich die Informationen (wie von Microsoft empfohlen) über:
DSiGetTrueWindowsVersion
Delphi-Quellcode:
function DSiGetTrueWindowsVersion: TDSiWindowsVersion;
function ExportsAPI(module: HMODULE; const apiName: string): boolean; begin Result := GetProcAddress(module, PChar(apiName)) <> nil; end; { ExportsAPI } var hKernel32: HMODULE; begin { DSiGetTrueWindowsVersion } hKernel32 := GetModuleHandle('kernel32'); ... |
AW: OS Version Windows 10 ermitteln.
Zitat:
|
AW: OS Version Windows 10 ermitteln.
Zitat:
|
AW: OS Version Windows 10 ermitteln.
... ich hol den Thread noch mal hoch ...
Betreff der Diskussionen zur Notwendigkeit (& Richtigkeit) einer Versionsprüfung gebe ich aus meiner Sicht z.B. die "WLAN-API" mal zu Bedenken. Dort gibt es seit XP über Vista, Win 7 und Win 8 je Version neue Funktionen, wo es schon Wissenswert ist, welches OS läuft und welche Funktionalität das Proggie damit noch gewährleisten kann Ab WIN 10 gibt es dann eh eine neue API - ob die "alte" dort noch funzt ? (Hab z.Zt. keinen WIN-10 Rechner greifbar). Problem scheint ja offensichtlich zu sein, das nicht nur Delphi-interne Funktionen u. a. API-Funcs scheinbar bei der Version 6.2 stehengeblieben sind - sofern hier kein Manifest-Update stattfindet. Angeblich soll WIN 10 dann auch 6.4 melden... Die Registry auszulesen halte ich hier nach wie vor am sinnigsten - wird es diese doch sicher auch mit/nach WIN 11 o. ä. aus Kompatibilitätsgründen weiterhin geben / geben müssen !? Mit WIN 8.1 bekomme ich hier als 'CurrentVersion' 6.3 - ohne ohne Änderung am Manifest. Im Post #18 beschreibt Gerd01 seine Reg zur "CurrentVersion" für WIN 10. Dort sieht man die Einträge "CurrentMajorVersionNumber" mit Wert=10 und "CurrentMinorVersionNumber" mit Wert = 0, die es in Versionen darunter nicht gibt. Warum diese nicht zusätzlich prüfen ? Da offensichtlich neu in WIN 10 wird es diese mit entsprehenden Versions-Nummer sicher auch weiterhin geben. Build-Nr und Produkt-Name u. a. sind auch so wie bisher Ich hab mir dazu mal ein kleines, noch übersichtliches Tool gebastelt, was auf eine erforderlich Minimal-Version/Build testet und ggf. eine Info auswirft:
Delphi-Quellcode:
Aufruf:
function CheckWinVer(var WinVerMaj : integer;
var WinVerMin : integer; var WinVerBuild : integer; var WinProdName : string; ShowMsg : boolean) : boolean; var reg: TRegistry; // USES: Registry s1, s2 : string; MemVerMaj : integer; MemVerMin : integer; MemVerBuild : integer; MsgType : TMsgDlgType; begin result := true; MsgType := TMsgDlgType.mtInformation; MemVerMaj := WinVerMaj; MemVerMin := WinVerMin; MemVerBuild := WinVerBuild; reg := TRegistry.Create(KEY_READ); reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',false) then begin // since WIN 10: try WinVerMaj := reg.ReadInteger('CurrentMajorVersionNumber'); // dword:0000000a WinVerMin := reg.ReadInteger('CurrentMinorVersionNumber'); // dword:00000000 except WinVerMaj := -1; WinVerMin := 0; end; if (WinVerMaj < 0) then begin s1 := reg.ReadString('CurrentVersion'); s2 := Copy(s1, 1, Pos('.', s1) - 1); WinVerMaj := strtoint(s2); s2 := Copy(s1, Pos('.', s1) + 1, length(s1)); WinVerMin := strtoint(s2); end; s1 := reg.ReadString('CurrentBuildNumber'); WinVerBuild := strtoint(s1); WinProdName := reg.ReadString('ProductName'); s1 := 'OS-Version: ' + WinProdName + #10#13 + inttostr(WinVerMaj) + '.' + inttostr(WinVerMin) + ' - Build ' + inttostr(WinVerBuild); s2 := ''; // check necessaryVersion if NOT (WinVerMaj >= MemVerMaj) then begin s2 := #10#13 + '-> Major-Version lower as expected ! (' + inttostr(MemVerMaj) + ')'; result := false; end; // if NOT (WinVerMin >= MemVerMin) then --- nicht ganz richtig ... if (NOT (WinVerMaj > MemVerMaj)) AND (NOT (WinVerMin >= MemVerMin)) then begin s2 := s2 + #10#13 + '-> Minor-Version lower as expected ! (' + inttostr(MemVerMin) + ')'; result := false; end; if NOT (WinVerBuild >= MemVerBuild) then begin s2 := s2 + #10#13 + '-> Build-Nr. lower as expected ! (' + inttostr(MemVerBuild) + ')'; result := false; end; if NOT result then MsgType := TMsgDlgType.mtWarning; end else begin result := false; MsgType := TMsgDlgType.mtError; WinVerMaj := -1; WinVerMin := -1; WinVerBuild := -1; WinProdName := 'Unknown Version'; s1 := 'WARNING: Determine OS-Version failed !'; s2 := ''; end; reg.CloseKey(); reg.Free; if ShowMsg then begin MessageDlg(s1 + s2, MsgType, [mbOK], 0); end; end;
Delphi-Quellcode:
Funzt hier beim Test auf XP, WIN 7 und WIN 8.1 - je nach Vorgabe der Min.-Version
// globale var's:
FWinVerMaj : integer; FWinVerMin : integer; FWinBuild : integer; FWinProdName : string; .... // Definition min. z. B.: FWinVerMaj := 6; // >= XP > 6 für WIN 10 FWinVerMin := 1; // >= WIN 7 > 3 für WIN 10 FWinBuild := -1; // no check FWinProdName := ''; // default // Aufruf: if NOT CheckWinVer(FWinVerMaj, FWinVerMin, FWinBuild, FWinProdName, true) then // ShowMsg close; // ... oder halt was anderes ... Könnte das mal bitte jemand mit einem WIN-10-Rechner testen ? |
AW: OS Version Windows 10 ermitteln.
OS-Version: Windows 10 Enterprise
10.0 - Build 15063 -> Minor-Version lower as expected ! (1) So ist die Prüfung aber nicht sinnvoll, oder? Weil 10.0 ja größer als 6.1 sein sollte? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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