Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   OS Version Windows 10 ermitteln. (https://www.delphipraxis.net/186147-os-version-windows-10-ermitteln.html)

RWarnecke 11. Jan 2016 12:39

AW: OS Version Windows 10 ermitteln.
 
Vielleicht hilft Dir ja diese API weiter.

mensch72 12. Jan 2016 09:54

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.

AlexII 12. Jan 2016 10:04

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von mensch72 (Beitrag 1326716)
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.

Ein Beispiel vllt?

himitsu 12. Jan 2016 10:07

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von AlexII (Beitrag 1326717)
Ein Beispiel vllt?

Wofür?

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.

geskill 13. Jan 2016 22:54

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.

Sir Rufo 13. Jan 2016 23:27

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von geskill (Beitrag 1326938)
Also ich kann noch die DSiWin32.pas empfehlen. Dort gibt es die DSiGetWindowsVersion()-Funktion. Wird auch in der OmniThreadLibrary verwendet.

Und da gibt es noch eine
Delphi-Quellcode:
DSiGetTrueWindowsVersion
und die holt sich die Informationen (wie von Microsoft empfohlen) über:
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');
  ...

a.def 11. Apr 2017 17:27

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von Gerd01 (Beitrag 1311550)
Ich habe den Gedanken von Sir Rufos, die Productversion von kernel32.dll zu prüfen, mal aufgegriffen und eine Abfrage meiner kernerl32.dll gemacht.

Code:
C:\Windows\System32\kernel32.dll
FFI: Product Version: 10.0.10240.16384
FFI: File Version: 6.2.10240.16384
Number of Translations: 1
Translation: 040704B0
  Comments = ""
  CompanyName = "Microsoft Corporation"
  FileDescription = "Client-DLL für Windows NT-Basis-API"
  FileVersion = "10.0.10240.16384 (th1.150709-1700)"
  InternalName = "kernel32"
  LegalCopyright = "© Microsoft Corporation. Alle Rechte vorbehalten."
  LegalTrademarks = ""
  OriginalFilename = "kernel32"
  PrivateBuild = ""
  ProductName = "Betriebssystem Microsoft® Windows®"
  ProductVersion = "10.0.10240.16384"
  SpecialBuild = ""
Also in der Productversion kann man Major,Minor und Build auslesen. Nur die Frage ist, wie sicher ist das für andere Versionen? Ich werde mal weiter recherchieren.

Gerade versucht und gescheitert. Unter Windows 10 (1703) bekomme ich 10.0.15063.0 bei ProductVersion.

holliesoft 11. Apr 2017 18:37

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Gerade versucht und gescheitert. Unter Windows 10 (1703) bekomme ich 10.0.15063.0 bei ProductVersion.
15063 ist die korrekte Buildnummer der 1703. Schau mal in Winver.exe, da stehts.

TERWI 6. Sep 2017 14:04

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:
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;
Aufruf:
Delphi-Quellcode:
// 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 ...
Funzt hier beim Test auf XP, WIN 7 und WIN 8.1 - je nach Vorgabe der Min.-Version
Könnte das mal bitte jemand mit einem WIN-10-Rechner testen ?

bra 6. Sep 2017 14:36

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 07:47 Uhr.
Seite 6 von 8   « Erste     456 78      

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