Delphi-PRAXiS
Seite 1 von 3  1 23      

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 23. Mai 2024 17:33

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.

mmw 23. Mai 2024 18:17

AW: Windows Version ermitteln
 
Hallo,
mit WMI funktioniert es.

Delphi-Quellcode:
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;
aufruf

Delphi-Quellcode:

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;
ich habe es hiermit erstellt.

https://github.com/RRUZ/wmi-delphi-code-creator

Gruß

kopernikus 23. Mai 2024 18:56

AW: Windows Version ermitteln
 
Man erkennt Windows 11 auch an der Build-Nummer. Sie ist größer oder gleich 22000.

Willie1 24. Mai 2024 17:31

AW: Windows Version ermitteln
 
Zitat:

Zitat von mmw (Beitrag 1537074)
Hallo,
mit WMI funktioniert es.

Ja, das stimmt! Vielen Dank. Nur wenn ich mir den Quelltext ansehe, frage ich mich, muss es so kompliziert sein? Willie.

himitsu 24. Mai 2024 17:42

AW: Windows Version ermitteln
 
Delphi-Referenz durchsuchenTOSVersion

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.

Sharky 24. Mai 2024 18:25

AW: Windows Version ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1537117)
Es wird nicht auf Versionen geprüft, sondern auf das Feature

Das ist natürlich Unsinn.

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.

jaenicke 24. Mai 2024 21:47

AW: Windows Version ermitteln
 
Zitat:

Zitat von Sharky (Beitrag 1537118)
Zitat:

Zitat von himitsu (Beitrag 1537117)
Es wird nicht auf Versionen geprüft, sondern auf das Feature

Das ist natürlich Unsinn.

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.

Den Fall hatte ich bisher tatsächlich extrem selten. Bisher konnte ich fast immer auf das Feature testen, und in den anderen Fällen wäre das mit etwas mehr Aufwand vermutlich auch gegangen, da ging es z.B. um das Touchhandling.

In welchen Fällen brauchtest du denn die Unterscheidung?

Zitat:

Zitat von Willie1 (Beitrag 1537072)
Microsoft hat wohl kein großes Interesse an Windows 11, sonst würden sie W11 eine neue Versionsnummer gönnen.

Tatsächlich hat Microsoft die echte Windowsversion aktiv vor Programmen verborgen, weil viele Entwickler auf die geniale Idee gekommen waren, auf bestimmte Versionen zu prüfen. Deshalb funktionierten plötzlich Programme mit einer neuen Version von Windows nicht mehr, obwohl es technisch gar kein Problem gegeben hätte. Das ist auch einer der Gründe, weshalb es keine größeren Sprünge mehr gab.

himitsu 24. Mai 2024 22:38

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.

Willie1 26. Mai 2024 17:05

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:
if IsWin7 then
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.

Willie.

DaCoda 26. Mai 2024 17:21

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr.
Seite 1 von 3  1 23      

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