![]() |
Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Delphi Community,
wg. meiner Augen bin ich kaum noch aktiv als Delphi Programmierer. Aber einen neues Notebook habe ich mir nach 10 Jahren gekauft, weil Vorlesen und Lupe sehr hilfreich für mich sind. Meine alten Programme laufen auch unter Windows 11 gut. Eines fällt mir auf: ich zeige in der About-Box die Windows Version an und es lässt sich Win 11 nicht von Win 10 unterscheiden. Ich hatte ein kleines Testprogramm gebastelt. Siehe Screenshot. Ich habe gegooglelt und 2 Beiträge (StackOverflow, Ct) gefunden. Beide sagen, an der Build-Nummer lässt es sich unterscheiden. Build >= 22000 Windows 11. Stimmt das verbindlich? Ich habe nur 2 Systeme und kann es nur begrenzt ausprobieren. Wie erkennt W11 denn sich selbst? Winver zeigt es korrekt an. Microsoft hat wohl kein großes Interesse an Windows 11, sonst würden sie W11 eine neue Versionsnummer gönnen. Gruß Willie. Der Screenshot zeigt W10 aber bei W11 ist nur die Build-Nummer anders. |
AW: Windows Version ermitteln
Hallo,
mit WMI funktioniert es.
Delphi-Quellcode:
aufruf
procedure GetCIM_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 CIM_OperatingSystem', 'WQL', wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin memo1.Lines.add(FWbemObject.Caption); //<<------ müsste entsprechend angepasst werden. FWbemObject:=Unassigned; end; end;
Delphi-Quellcode:
ich habe es hiermit erstellt.begin try memo1.Lines.clear; coInitialize(nil); try GetCIM_OperatingSystemInfo; finally CoUninitialize; end; except on E:EOleException do showmessage(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do ShowMessage(E.Classname+' : '+ E.Message); end; end; ![]() Gruß |
AW: Windows Version ermitteln
Man erkennt Windows 11 auch an der Build-Nummer. Sie ist größer oder gleich 22000.
|
AW: Windows Version ermitteln
Zitat:
|
AW: Windows Version ermitteln
![]() Aber wie es oft genug gesagt wird: Es wird nicht auf Versionen geprüft, sondern auf das Feature, welches benötigt wird. Genauso, wie man nicht auf "Admin" prüft, sondern auf das Recht, welches nötig ist. |
AW: Windows Version ermitteln
Zitat:
Jeder, der sich mit den MS Produkten auskennt, weiß, dass er auf beides prüfen muss. Feature in Windows X muss nicht die gleichen Funktionen wie das gleiche Feature in Windows Y haben. |
AW: Windows Version ermitteln
Zitat:
In welchen Fällen brauchtest du denn die Unterscheidung? Zitat:
|
AW: Windows Version ermitteln
Das Auslesen über die API hängt auch noch von der Virtualisierung ab.
Wird das Programm für Windows XP virtualisiert, dann sagt die API auch, es sei ein XP. Da man dann auch die Features von XP bekommt, wäre bei einer Prüfung auf die Version dann XP auch vollkommen richtig, und sich irgendwie auf wirren Wegen die "echte" Version zu besorgen bringt dann ja nicht viel, wenn dann das gewünschte Feature dort nicht erreichbar ist. |
AW: Windows Version ermitteln
Hi,
mein alter Kindergartenfreund schwört auf Windows 7 und das soll die älteste Version sein, die meine Programme unterstützen. Ihr hattet mir schon vor Jahren abgeraten, Abfragen wie
Delphi-Quellcode:
zu benutzen. Ich frage überhaupt nichts ab. Das macht schon das Installationsprogramm InnoSetup. Ich will nur eine korrekte Anzeige der Windows Version in der About-Box. Siegt sonst doof aus. Die Größe des Arbeitsspeichers, die ich auch anzeige ist zum Glück seid Delphi 6 bis heute (Windows 98-Win 11) richtig geblieben.
if IsWin7 then
Willie. |
AW: Windows Version ermitteln
Du bekommst eigentlich alle Infos aus System.SysUtils.TOSVersion:
Code:
uses Syste.SysUtils; sTest := 'Betriebssystem: ' + TOSVersion.Name; sTest := 'Build: ' + TOSVersion.Build.ToString; etc. |
AW: Windows Version ermitteln
Zitat:
|
AW: Windows Version ermitteln
Zitat:
Aber das kann natürlich jeder machen wie er möchte. |
AW: Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das mal getestet unter Windows 11:
Code:
Ergebnis siehe beigefügtes Bild.
Listbox1.Items.Add(TOSVersion.Name);
Listbox1.Items.Add(TOSVersion.Build.ToString); Listbox1.Items.Add(TOSVersion.Major.ToString); Listbox1.Items.Add(TOSVersion.Minor.ToString); |
AW: Windows Version ermitteln
Zitat:
|
AW: Windows Version ermitteln
Hallo DaCoda, dann hast du wahrscheinlich Delphi 11. Bei mir wird für Build, Major, Minor u.a. Integer Werte immer 0 angezeigt. Auch 11 wird nicht angezeigt.
Delphi-Quellcode:
Bei mir steht Windows 10 (Version 10.0 Build 0 64-Bit Edition) auf beiden Rechnern.
TOSVesrion.ToString
|
AW: Windows Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Wille,
hol dir die Info's doch direct aus der Registry: |
AW: Windows Version ermitteln
Zitat:
|
AW: Windows Version ermitteln
Wie wir im Manifest sehen, ist ein Windows 11 ja auch ein 10 ... hat jedenfalls die selbe GUID :stupid:
|
AW: Windows Version ermitteln
Zitat:
|
AW: Windows Version ermitteln
macOS ist auch nur der neue Name ... intern ist es doch auch nur ein OS X, also soooo verkehrt kann es nicht sein :stupid:
|
AW: Windows Version ermitteln
Zitat:
Mit WMI klappt das offensichtlich auch bei Windows 11. Bei ![]() |
AW: Windows Version ermitteln
Hallo,
das geht auch.
Delphi-Quellcode:
komplette Beschreibung hier -
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; ![]() habe ich mit dem glreichen Programm erstellt siehe #2. Der Code Schnipsel muss wieder angepasst werden. Gruß |
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. |
AW: Windows Version ermitteln
PS: Nicht im GetIt nach WMI suchen! :zwinker:
|
AW: Windows Version ermitteln
|
AW: Windows Version ermitteln
Zitat:
|
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. |
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ß |
AW: Windows Version ermitteln
Zitat:
Wille |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
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