AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OS Version Windows 10 ermitteln.

Ein Thema von Gerd01 · begonnen am 7. Aug 2015 · letzter Beitrag vom 18. Jun 2019
Antwort Antwort
Seite 1 von 8  1 23     Letzte » 
Gerd01

Registriert seit: 18. Mär 2005
Ort: NRW
117 Beiträge
 
Delphi XE2 Professional
 
#1

OS Version Windows 10 ermitteln.

  Alt 7. Aug 2015, 16:40
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: OS Version Windows 10 ermitteln.

  Alt 7. Aug 2015, 18:42
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: OS Version Windows 10 ermitteln.

  Alt 7. Aug 2015, 20:30
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.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: OS Version Windows 10 ermitteln.

  Alt 7. Aug 2015, 22:39
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#5

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 02:15
..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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 06:52
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 8. Aug 2015 um 06:54 Uhr)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 09:06
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.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 09:23
@mm1256

Dann weißt du aber nur, auf welchem OS deine Anwendung läuft, was dir wobei hilft?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 09:47
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.

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.

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.

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.

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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: OS Version Windows 10 ermitteln.

  Alt 8. Aug 2015, 09:49
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
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