Delphi-PRAXiS
Seite 1 von 8  1 23     Letzte »    

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)

Gerd01 7. Aug 2015 15:40

OS Version Windows 10 ermitteln.
 
Bis Windows 8.1 habe ich das Operating System über Win32Platform und dann über die Win32MajorVersion und Win32MinorVersion ermittelt (Bitte keine Frage Warum man die Windows-Version benötigt). Mit Windows Version 10 geht das so nicht mehr.
Ich habe mir deshab folgende "Krücke" durch das Auslesen der Registry gebaut:

Code:
Type
  TWinOSType = ( win_UnknownPlatform,
                 win32_95, win32_98, win32_ME,
                 win32_NT, win32_2000, win32_XP,
                 win_Vista, win_Win7, win_Win8, win_Win10 );

function Windows10FromRegistry: Boolean;
var
  s: string;
begin
  Result := false;
  with TRegistry.Create(KEY_EXECUTE) do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion') then
    try
      if ValueExists('CurrentVersion')
        then s := Readstring('CurrentVersion');
      if s = '6.3' then
        if ValueExists('CurrentBuildNumber')
          then s := Readstring('CurrentBuildNumber');
      Result := StrToIntDef(s,0) >= 10240;
    except
    end;
    CloseKey;
  finally
    Free;
  end;
end;

function GetWinOSType: TWinOSType;
begin
  Result := win_UnknownPlatform;
 case Win32Platform of
    VER_PLATFORM_WIN32_WINDOWS:// 1=9x-Reihe
      If Win32MajorVersion=4 Then
      Begin
        Case Win32MinorVersion of
          0 : result := win32_95;
          10: result:= win32_98;
          90: result:= win32_ME;
        end;
      end;
    VER_PLATFORM_WIN32_NT: // 2=NT-Reihe
     Case Win32MajorVersion of
         3:IF Win32MinorVersion=51 then
              result:= win32_NT;//'Windows NT 3.51';
         4:If Win32MinorVersion=0 then
             result:= win32_NT; //'Windows NT 4';
         5:Case Win32MinorVersion of
              0: result:= win32_2000;
              1: result:= win32_xp; //'Windows XP';
              2: result:= win32_xp; //'Windows .NET Server';
           end;
         6:case Win32MinorVersion of
              0: result := win_Vista;
              1: Result := win_Win7;
//              2: Result := Result := win_Win8;
              2:Begin
                 Result := win_Win8;
                 if Windows10FromRegistry then
                   Result := win_Win10;
                End;
           end;
     End;
  end;
end;
Hat jemand eine Idee, wie man das eleganter "sicherer" darstellen kann? Für Eure Hilfe wäre ich dankbar.

Gruß Gerd

jaenicke 7. Aug 2015 17:42

AW: OS Version Windows 10 ermitteln.
 
Es kann dir passieren, dass in Zukunft auch das nicht mehr funktioniert. Der Grund ist, dass Microsoft die Praxis ausmerzen möchte, dass auf die Windowsversion statt auf das benötigte Feature geprüft wird.
(Dass das sinnvoll ist, sehe ich im Übrigen genauso nachdem in der Vergangenheit oft Software nicht mehr funktioniert hat, weil nur die Windowsversion geprüft wurde...)

Das Auslesen der Windowsversion sollte aber auch klappen, wenn du per Manifest erklärst, dass deine Software Windowsversion 10 unterstützt. Denn Windows liefert nur bei neueren Windowsversionen als die unterstützte eine falsche Version zurück. Wenn deine Software die Version unterstützt, müsstest du auch die richtige bekommen.
Getestet habe ich das allerdings nicht, weil ich sauber auf die Features teste, die ich benötige...

mm1256 7. Aug 2015 19:30

AW: OS Version Windows 10 ermitteln.
 
Hallo,

das ganze Plattform-Gedöns und die Winapi sind wertlos, wenn MS mit einer der nächsten Windows-Versionen wieder was Neues erfindet. Meine alten Programme die noch darauf setzen laufen z.B. bis heute munter weiter. Das ist gelinde gesagt Bockmi...

Da kann ich den Versions-Check gleich weglassen, oder als Alternative - weil die Infos in der Registry wohl so schnell nicht aussterben werden - die Info's gleich aus der Registry ziehen, und somit auch kompatibel zu jeder neuen Windows-Version sein.

@Gerd01 Darum würde ich einfach aus der Registry "ProductName" und "CurrentBuild" auswerten, und sonst nichts. Ich werde es jedenfalls meinen alten Code in Kürze in die Tonne treten und es so machen. Wir könnten ja hier mal eine Aktion starten, was bei "ProductName" so alles drin steht.

Bernhard Geyer 7. Aug 2015 21:39

AW: OS Version Windows 10 ermitteln.
 
Die Lösung Major/Minor-Version geht immer noch. Du musst nur die verwendete Manifestdatei akualisieren und um einen kompatiblitätseintag für Win10 ergänzen. Ansonst läuft deine App im Win8 Kompatiblitätsmodus

jus 8. Aug 2015 01:15

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von jaenicke (Beitrag 1311466)
..Getestet habe ich das allerdings nicht, weil ich sauber auf die Features teste, die ich benötige...

Hallo jaenicke. Mich würde ernsthaft interessieren wie man auf die Features testet. Kannst du da mal ein Beispiel bringen?

Lg,
jus

jaenicke 8. Aug 2015 05:52

AW: OS Version Windows 10 ermitteln.
 
Ein Beispiel:
Wenn ich die API Funktion GetServiceTimes verwende, benötigt man für das Programm mindestens XP mit SP3. Statt deshalb eine Prüfung einzubauen, ob es sich mindestens um XP mit SP3 handelt, prüfe ich einfach ob die benötigte Funktion da ist. Ist sie es nicht, fehlt sie mir, ergo zeige ich einen Fehler an, dass das System nicht unterstützt wird.

Das hat dann den Vorteil, dass es unter allen WindowsVersionen klappt, und zwar auch dann, wenn die Funktion später einmal entfernt würde...
Wenn man auf die Windowsversion prüft, bekommt man das nicht mit.

Auf diese Weise kann man auch, wenn möglich, nur bestimmte Module der Anwendung deaktivieren, wenn nur Teile der Anwendung das Feature brauchen.

mm1256 8. Aug 2015 08:06

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1311476)
Die Lösung Major/Minor-Version geht immer noch. Du musst nur die verwendete Manifestdatei akualisieren und um einen kompatiblitätseintag für Win10 ergänzen. Ansonst läuft deine App im Win8 Kompatiblitätsmodus

Um den Kompatibilitätsmodus geht es mir doch gar nicht. Klar, dass ich bei aktuellen Apps auch ein aktuelles Manifest brauche.

Du hast das ursächliche Problem auf das ich hinaus wollte nicht verstanden. Ich kann doch auf einer z.B. 5 Jahre alten und beim Kunden installierten Software nicht im Nachhinein das Manifest aktualisieren, nur um festzustellen, ob meine SW das laufende OS unterstützt. Das geht praktisch gar nicht. Demzufolge funktioniert die Versionsprüfung bei diesen Programmen nicht mehr, d.h. Win 8.1 wird nicht erkannt, denn ab dwMajorVersion = 6 und dwMinorVersion = 2 gibt's über GetVersionEx() keine aktuelle Build-Nummer mehr.

Eine Windows-Versions-Prüfung macht aber - aus meiner Sicht und für meine Zwecke - nur Sinn, wenn sie jetzt schon auch mit zukünftigen, also heute noch gar nicht auf dem Markt befindlichen Windows-Versionen klar kommt. Denn, wer weiß, was sich MS mit Win 11 wieder neu einfallen lässt? Und da ist der gemeinsame Nenner die Registry. Und wenn dann in ein paar Jahren meine jetzt aktuelle, zu dem Zeitpunkt aber schon wieder "veraltete" SW "ProductName=Windows 11" nicht kennt, dann ist das genau das, was ich brauche und erreichen will.

Sir Rufo 8. Aug 2015 08:23

AW: OS Version Windows 10 ermitteln.
 
@mm1256

Dann weißt du aber nur, auf welchem OS deine Anwendung läuft, was dir wobei hilft? :gruebel:

Bernhard Geyer 8. Aug 2015 08:47

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von mm1256 (Beitrag 1311483)
Um den Kompatibilitätsmodus geht es mir doch gar nicht.

Doch. Geht es. Wenn eine Anwendung keinen Manifesteintrag hat läuft es zwangsweise im Kompatiblitätsmodus. Ist seit Vista so.

Zitat:

Zitat von mm1256 (Beitrag 1311483)
Du hast das ursächliche Problem auf das ich hinaus wollte nicht verstanden. Ich kann doch auf einer z.B. 5 Jahre alten und beim Kunden installierten Software nicht im Nachhinein das Manifest aktualisieren, nur um festzustellen, ob meine SW das laufende OS unterstützt.

Wieso nicht? CVS auf den entsprechenden Release-Tag stellen, auschecken, manifest erweitern, Compilieren (und signieren...).
oder einfach in der Exe per Ressourcenhacker das Manifest ergänzen.

Zitat:

Zitat von mm1256 (Beitrag 1311483)
Das geht praktisch gar nicht. Demzufolge funktioniert die Versionsprüfung bei diesen Programmen nicht mehr, d.h. Win 8.1 wird nicht erkannt, denn ab dwMajorVersion = 6 und dwMinorVersion = 2 gibt's über GetVersionEx() keine aktuelle Build-Nummer mehr.

Doch! Macht es. Wenn das manifest passt liefert GetVersionEx auch die Windows10-Versionsinfo. Steht auch genauso in der MSDN beschrieben.

Zitat:

Zitat von mm1256 (Beitrag 1311483)
Eine Windows-Versions-Prüfung macht aber - aus meiner Sicht und für meine Zwecke - nur Sinn, wenn sie jetzt schon auch mit zukünftigen, also heute noch gar nicht auf dem Markt befindlichen Windows-Versionen klar kommt. Denn, wer weiß, was sich MS mit Win 11 wieder neu einfallen lässt?

Dann macht eine Versionsprüfung keinen Sinn. Denn eine vorausschauende Prüfung funktioniert einfach nicht.

Zitat:

Zitat von mm1256 (Beitrag 1311483)
Und da ist der gemeinsame Nenner die Registry. Und wenn dann in ein paar Jahren meine jetzt aktuelle, zu dem Zeitpunkt aber schon wieder "veraltete" SW "ProductName=Windows 11" nicht kennt, dann ist das genau das, was ich brauche und erreichen will.

Wer sagt das MS (wie schon beim IE) hier nicht einfach auch nur bis Win10 den Wert reinschreibt? Dann bekommst du über diesen "gemeinsamen Nenner" auch nur eine Kompatiblitätsangabe.

Bernhard Geyer 8. Aug 2015 08:49

AW: OS Version Windows 10 ermitteln.
 
Zitat:

Zitat von jaenicke (Beitrag 1311480)
Ein Beispiel:
Wenn ich die API Funktion GetServiceTimes verwende, benötigt man für das Programm mindestens XP mit SP3. Statt deshalb eine Prüfung einzubauen, ob es sich mindestens um XP mit SP3 handelt, prüfe ich einfach ob die benötigte Funktion da ist. Ist sie es nicht, fehlt sie mir, ergo zeige ich einen Fehler an, dass das System nicht unterstützt wird.

Wenn man das konsequent durchzieht besteht der Quellcode am Ende zu 90% aus Versionsprüfungen. Ob das ein vernünftiges Ziel ist?
Ich gehe bei MS davon aus das nur neue Funktionen dazukommen und abgekündigte Funktionen noch einige Zeit existieren. Seit dem wir nicht mehr Win9x existieren sind gefühlt 90% der Versionsprüfungen aus dem Quellcode rausgeflogen.
Bei Apple würde m.E. diese Prüfung auch nichts bringen da dann die Anwendung vermutlich gar nicht zugelassen würde. Da muss dann der Code ganz raus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 Uhr.
Seite 1 von 8  1 23     Letzte »    

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