Delphi-PRAXiS
Seite 3 von 3     123   

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

Willie1 27. Mai 2024 17:58

AW: Windows Version ermitteln
 
Zitat:

Zitat von DaCoda (Beitrag 1537164)
Hallo Wille,
hol dir die Info's doch direct aus der Registry:

Sieh dir meinen Screenshot an, Methode 3 benutzt die Registry, es steht Windows 10 da! Ich will nur die installierte Windows Version ermitteln.

Mit WMI klappt das offensichtlich auch bei Windows 11. Bei https://www.der-windows-papst.de/wp-...-einsetzen.pdf steht, dass man auch mit WMI die Build Nummer ermitteln kann. Ich habe WMI nicht gelernt, kann einer von euch das verstehen?

mmw 27. Mai 2024 18:42

AW: Windows Version ermitteln
 
Hallo,

das geht auch.
Delphi-Quellcode:
procedure GetWin32_OperatingSystemInfo;
const
  WbemUser = '';
  WbemPassword = '';
  WbemComputer = 'localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator,
  FWMIService,
  FWbemObjectSet,
  FWbemObject: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet := FWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem', 'WQL', wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
   begin
    memo1.Lines.add(Format('BootDevice                                  %s',[String(FWbemObject.BootDevice)]));
    Memo1.Lines.add(Format('BuildNumber                                 %s',[String(FWbemObject.BuildNumber)]));// String
    Memo1.Lines.Add(Format('Caption                                     %s',[String(FWbemObject.Caption)]));// String
    FWbemObject:=Unassigned;
   end;
end;


begin
 try
  memo1.Lines.Clear;
  CoInitialize(nil);
   try
    GetWin32_OperatingSystemInfo;
   finally
    CoUninitialize;
   end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 end;
komplette Beschreibung hier -
https://learn.microsoft.com/de-de/wi...peratingsystem

habe ich mit dem glreichen Programm erstellt siehe #2. Der Code Schnipsel muss wieder angepasst werden.

Gruß

KodeZwerg 27. Mai 2024 18:49

AW: Windows Version ermitteln
 
So mache ich es, es liest Major, Minor, Build und Revisionsnummber von Windows aus.
Kompatibel mit Turbo Delphi 2006, FreePascal, RADStudio etc...
Es erscheint nicht "Das ist Windows 11" sondern was auch immer Windows selbst für sich hinterlegt hat als numerischer Wert.
Delphi-Quellcode:
program winverex;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

type
  TWindowsVersion = packed record
    Major,
    Minor,
    Build,
    Revision: DWORD;
  end;

function GetWindowsVersion: TWindowsVersion;
type
  TVSFixedFileInfo = record
    dwSignature,
    dwStrucVersion,
    dwFileVersionMS,
    dwFileVersionLS,
    dwProductVersionMS,
    dwProductVersionLS,
    dwFileFlagsMask,
    dwFileFlags,
    dwFileOS,
    dwFileType,
    dwFileSubtype,
    dwFileDateMS,
    dwFileDateLS: DWORD;
  end;
  PVSFixedFileInfo = ^TVSFixedFileInfo;
  TRtlGetNtVersionNumbers = procedure(out MajorVersion, MinorVersion, BuildNumber: DWORD); stdcall;
var
  RtlGetNtVersionNumbers: TRtlGetNtVersionNumbers;
  hLib: HINST;
  dwHandle: DWORD;
  pBuffer: Pointer;
  pVersionInfo: PVSFIXEDFILEINFO;
  dwLen: DWORD;
  WindowsDir: array[0..Pred(MAX_PATH)] of AnsiChar;
  WideWindowsDir: WideString;
  GotRtlVer: Boolean;
begin
  dwHandle := 0;
  pVersionInfo := nil;
  GotRtlVer := False;
  GetWindowsDirectory(WindowsDir, MAX_PATH);
  StrCat(WindowsDir, '\System32\Ntdll.dll');
  SetString(WideWindowsDir, PAnsiChar(@WindowsDir[0]), Length(WindowsDir));
  hLib := LoadLibraryW(PWideChar(WideWindowsDir));
  if hLib <> 0 then
    begin
      RtlGetNtVersionNumbers := TRtlGetNtVersionNumbers(GetProcAddress(hLib, 'RtlGetNtVersionNumbers'));
      if Assigned(RtlGetNtVersionNumbers) then
        begin
          RtlGetNtVersionNumbers(Result.Major, Result.Minor, Result.Build);
          GotRtlVer := True;
        end;
      FreeLibrary(hLib);
    end;
  Result.Revision := 0;
  dwLen := GetFileVersionInfoSizeW(PWideChar(WideWindowsDir), dwHandle);
  if dwLen > 0 then
    begin
      pBuffer := AllocMem(dwLen);
      try
        if GetFileVersionInfoW(PWideChar(WideWindowsDir), dwHandle, dwLen, pBuffer) then
          begin
            if VerQueryValueW(pBuffer, '\', Pointer(pVersionInfo), dwLen) then
              begin
                if not GotRtlVer then
                  begin
                    Result.Major := HiWord(pVersionInfo^.dwFileVersionMS);
                    Result.Minor := LoWord(pVersionInfo^.dwFileVersionMS);
                  end;
                Result.Build := HiWord(pVersionInfo^.dwFileVersionLS);
                Result.Revision := LoWord(pVersionInfo^.dwFileVersionLS);
              end;
          end;
      finally
        FreeMem(pBuffer);
      end;
    end;
end;

var
  WindowsVersion: TWindowsVersion;
begin
  WindowsVersion := GetWindowsVersion;
  WriteLn(Format('Windows version: %d.%d.%d.%d', [WindowsVersion.Major, WindowsVersion.Minor, WindowsVersion.Build, WindowsVersion.Revision]));
  WriteLn('Done');
  ReadLn;
end.

himitsu 27. Mai 2024 19:14

AW: Windows Version ermitteln
 
PS: Nicht im GetIt nach WMI suchen! :zwinker:

mmw 27. Mai 2024 19:37

AW: Windows Version ermitteln
 
evtl. hier -
https://github.com/NeftaliDelphi/GLi...readme-ov-file

Gruß

uligerhardt 27. Mai 2024 20:37

AW: Windows Version ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1537215)
PS: Nicht im GetIt nach WMI suchen! :zwinker:

Ok, IDE startet... :-D

Willie1 29. Mai 2024 18:12

AW: Windows Version ermitteln
 
Die Methode von mmw funktioniert bei Windows 10 und 11 und wird auch bei 12(?) laufen. Ich übernehme sie . Major, Minor usw. werden von Windows 11 ignoriert.

CodeZwerg: ich bin mit Delphi Berlin nicht gerade aktuell aber Delphi 2006 und Turbo Delphi sind mit meinem alten Notebook voriges Jahr gestorben.

Schönen Feiertag in den entsprechenden Bundesländern Willie.

mmw 30. Mai 2024 18:44

AW: Windows Version ermitteln
 
Hallo,

Nachtrag -

mit den bei den Jedi- Komponenten vorhandenen unit 'jclSysInfo' funktioniert es auch (sollte, mit Delphi 10.4.2 Starter getestet)

'jclSysInfo.GetWindowsVersionString'
'jclSysInfo.GetWindowsBuildNumber'

Gruß

Willie1 31. Mai 2024 16:41

AW: Windows Version ermitteln
 
Zitat:

Zitat von mmw (Beitrag 1537321)
mit den bei den Jedi- Komponenten vorhandenen unit 'jclSysInfo' funktioniert es auch (sollte, mit Delphi 10.4.2 Starter getestet)

'jclSysInfo.GetWindowsVersionString'
'jclSysInfo.GetWindowsBuildNumber'

Das ist gut zu wissen. Ich sehe, bei Delphi 11 liefert SysUtils.TOSVersion.ToString das richtige Ergebnis bei Win 10 und 11.
Wille


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz