AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OS Version Windows 10 ermitteln.

Ein Thema von Gerd01 · begonnen am 7. Aug 2015 · letzter Beitrag vom 18. Jun 2019
Antwort Antwort
Seite 6 von 8   « Erste     456 78      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#51

AW: OS Version Windows 10 ermitteln.

  Alt 11. Jan 2016, 13:39
Vielleicht hilft Dir ja diese API weiter.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#52

AW: OS Version Windows 10 ermitteln.

  Alt 12. Jan 2016, 10:54
Was für ein Stress mit Manifests, Registry und zig verschiedenen API Calls...

In der VersionInfo Resource der "kernel" oder "user" DLL steht seit Win2000 bis heute incl. aller ServicePacks dazwischen stets die reale&richtige OS Version drin.

Wer einfach wissen will, welches OS läuft liest das ganz ohne "simulierte" Werte dort aus und macht damit, was immer er will.
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#53

AW: OS Version Windows 10 ermitteln.

  Alt 12. Jan 2016, 11:04
Was für ein Stress mit Manifests, Registry und zig verschiedenen API Calls...

In der VersionInfo Resource der "kernel" oder "user" DLL steht seit Win2000 bis heute incl. aller ServicePacks dazwischen stets die reale&richtige OS Version drin.

Wer einfach wissen will, welches OS läuft liest das ganz ohne "simulierte" Werte dort aus und macht damit, was immer er will.
Ein Beispiel vllt?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#54

AW: OS Version Windows 10 ermitteln.

  Alt 12. Jan 2016, 11:07
Ein Beispiel vllt?
Wofür?

Das Auslesen von Versionsinfos ... zu finden in der CodeLib, bei Luckie, in Goggle usw.



Und wollen wir hoffen, dass kernel32.ddl (x86) und kernel32.dll (x64) gleich Versioniert sind.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#55

AW: OS Version Windows 10 ermitteln.

  Alt 13. Jan 2016, 23:54
Also ich kann noch die DSiWin32.pas empfehlen. Dort gibt es die DSiGetWindowsVersion()-Funktion. Wird auch in der OmniThreadLibrary verwendet.
Sebastian
  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
 
#56

AW: OS Version Windows 10 ermitteln.

  Alt 14. Jan 2016, 00:27
Also ich kann noch die DSiWin32.pas empfehlen. Dort gibt es die DSiGetWindowsVersion()-Funktion. Wird auch in der OmniThreadLibrary verwendet.
Und da gibt es noch eine DSiGetTrueWindowsVersion und die holt sich die Informationen (wie von Microsoft empfohlen) über:
Delphi-Quellcode:
function DSiGetTrueWindowsVersion: TDSiWindowsVersion;

    function ExportsAPI(module: HMODULE; const apiName: string): boolean;
    begin
      Result := GetProcAddress(module, PChar(apiName)) <> nil;
    end; { ExportsAPI }

  var
    hKernel32: HMODULE;

  begin { DSiGetTrueWindowsVersion }
    hKernel32 := GetModuleHandle('kernel32');
  ...
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
a.def
(Gast)

n/a Beiträge
 
#57

AW: OS Version Windows 10 ermitteln.

  Alt 11. Apr 2017, 18:27
Ich habe den Gedanken von Sir Rufos, die Productversion von kernel32.dll zu prüfen, mal aufgegriffen und eine Abfrage meiner kernerl32.dll gemacht.

Code:
C:\Windows\System32\kernel32.dll
FFI: Product Version: 10.0.10240.16384
FFI: File Version: 6.2.10240.16384
Number of Translations: 1
Translation: 040704B0
  Comments = ""
  CompanyName = "Microsoft Corporation"
  FileDescription = "Client-DLL für Windows NT-Basis-API"
  FileVersion = "10.0.10240.16384 (th1.150709-1700)"
  InternalName = "kernel32"
  LegalCopyright = "© Microsoft Corporation. Alle Rechte vorbehalten."
  LegalTrademarks = ""
  OriginalFilename = "kernel32"
  PrivateBuild = ""
  ProductName = "Betriebssystem Microsoft® Windows®"
  ProductVersion = "10.0.10240.16384"
  SpecialBuild = ""
Also in der Productversion kann man Major,Minor und Build auslesen. Nur die Frage ist, wie sicher ist das für andere Versionen? Ich werde mal weiter recherchieren.
Gerade versucht und gescheitert. Unter Windows 10 (1703) bekomme ich 10.0.15063.0 bei ProductVersion.
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#58

AW: OS Version Windows 10 ermitteln.

  Alt 11. Apr 2017, 19:37
Zitat:
Gerade versucht und gescheitert. Unter Windows 10 (1703) bekomme ich 10.0.15063.0 bei ProductVersion.
15063 ist die korrekte Buildnummer der 1703. Schau mal in Winver.exe, da stehts.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#59

AW: OS Version Windows 10 ermitteln.

  Alt 6. Sep 2017, 15:04
... ich hol den Thread noch mal hoch ...
Betreff der Diskussionen zur Notwendigkeit (& Richtigkeit) einer Versionsprüfung gebe ich aus meiner Sicht z.B. die "WLAN-API" mal zu Bedenken.
Dort gibt es seit XP über Vista, Win 7 und Win 8 je Version neue Funktionen, wo es schon Wissenswert ist, welches OS läuft und welche Funktionalität das Proggie damit noch gewährleisten kann
Ab WIN 10 gibt es dann eh eine neue API - ob die "alte" dort noch funzt ? (Hab z.Zt. keinen WIN-10 Rechner greifbar).

Problem scheint ja offensichtlich zu sein, das nicht nur Delphi-interne Funktionen u. a. API-Funcs scheinbar bei der Version 6.2 stehengeblieben sind - sofern hier kein Manifest-Update stattfindet. Angeblich soll WIN 10 dann auch 6.4 melden...

Die Registry auszulesen halte ich hier nach wie vor am sinnigsten - wird es diese doch sicher auch mit/nach WIN 11 o. ä. aus Kompatibilitätsgründen weiterhin geben / geben müssen !?
Mit WIN 8.1 bekomme ich hier als 'CurrentVersion' 6.3 - ohne ohne Änderung am Manifest.

Im Post #18 beschreibt Gerd01 seine Reg zur "CurrentVersion" für WIN 10.
Dort sieht man die Einträge "CurrentMajorVersionNumber" mit Wert=10 und "CurrentMinorVersionNumber" mit Wert = 0, die es in Versionen darunter nicht gibt.
Warum diese nicht zusätzlich prüfen ? Da offensichtlich neu in WIN 10 wird es diese mit entsprehenden Versions-Nummer sicher auch weiterhin geben.
Build-Nr und Produkt-Name u. a. sind auch so wie bisher

Ich hab mir dazu mal ein kleines, noch übersichtliches Tool gebastelt, was auf eine erforderlich Minimal-Version/Build testet und ggf. eine Info auswirft:
Delphi-Quellcode:
function CheckWinVer(var WinVerMaj : integer;
                     var WinVerMin : integer;
                     var WinVerBuild : integer;
                     var WinProdName : string;
                     ShowMsg : boolean) : boolean;
var
  reg: TRegistry; // USES: Registry
  s1, s2 : string;
  MemVerMaj : integer;
  MemVerMin : integer;
  MemVerBuild : integer;
  MsgType : TMsgDlgType;
begin
  result := true;
  MsgType := TMsgDlgType.mtInformation;
  MemVerMaj := WinVerMaj;
  MemVerMin := WinVerMin;
  MemVerBuild := WinVerBuild;
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
  if reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',false) then
  begin
    // since WIN 10:
    try
      WinVerMaj := reg.ReadInteger('CurrentMajorVersionNumber'); // dword:0000000a
      WinVerMin := reg.ReadInteger('CurrentMinorVersionNumber'); // dword:00000000
    except
      WinVerMaj := -1;
      WinVerMin := 0;
    end;
    if (WinVerMaj < 0) then
    begin
      s1 := reg.ReadString('CurrentVersion');
      s2 := Copy(s1, 1, Pos('.', s1) - 1);
      WinVerMaj := strtoint(s2);
      s2 := Copy(s1, Pos('.', s1) + 1, length(s1));
      WinVerMin := strtoint(s2);
    end;
    s1 := reg.ReadString('CurrentBuildNumber');
    WinVerBuild := strtoint(s1);
    WinProdName := reg.ReadString('ProductName');
    s1 := 'OS-Version: ' + WinProdName + #10#13 +
          inttostr(WinVerMaj) + '.' + inttostr(WinVerMin) + ' - Build ' + inttostr(WinVerBuild);
    s2 := '';
    // check necessaryVersion
    if NOT (WinVerMaj >= MemVerMaj) then
    begin
      s2 := #10#13 + '-> Major-Version lower as expected ! (' + inttostr(MemVerMaj) + ')';
      result := false;
    end;
    // if NOT (WinVerMin >= MemVerMin) then --- nicht ganz richtig ...
    if (NOT (WinVerMaj > MemVerMaj)) AND (NOT (WinVerMin >= MemVerMin)) then
    begin
      s2 := s2 + #10#13 + '-> Minor-Version lower as expected ! (' + inttostr(MemVerMin) + ')';
      result := false;
    end;
    if NOT (WinVerBuild >= MemVerBuild) then
    begin
      s2 := s2 + #10#13 + '-> Build-Nr. lower as expected ! (' + inttostr(MemVerBuild) + ')';
      result := false;
    end;
    if NOT result then
      MsgType := TMsgDlgType.mtWarning;
  end
  else
  begin
    result := false;
    MsgType := TMsgDlgType.mtError;
    WinVerMaj := -1;
    WinVerMin := -1;
    WinVerBuild := -1;
    WinProdName := 'Unknown Version';
    s1 := 'WARNING: Determine OS-Version failed !';
    s2 := '';
  end;
  reg.CloseKey();
  reg.Free;
  if ShowMsg then
  begin
    MessageDlg(s1 + s2, MsgType, [mbOK], 0);
  end;
end;
Aufruf:
Delphi-Quellcode:
// globale var's:
    FWinVerMaj : integer;
    FWinVerMin : integer;
    FWinBuild : integer;
    FWinProdName : string;
....
// Definition min. z. B.:
  FWinVerMaj := 6; // >= XP > 6 für WIN 10
  FWinVerMin := 1; // >= WIN 7 > 3 für WIN 10
  FWinBuild := -1; // no check
  FWinProdName := ''; // default
// Aufruf:
  if NOT CheckWinVer(FWinVerMaj,
                     FWinVerMin,
                     FWinBuild,
                     FWinProdName,
                     true) then // ShowMsg
    close; // ... oder halt was anderes ...
Funzt hier beim Test auf XP, WIN 7 und WIN 8.1 - je nach Vorgabe der Min.-Version
Könnte das mal bitte jemand mit einem WIN-10-Rechner testen ?

Geändert von TERWI ( 6. Sep 2017 um 16:35 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#60

AW: OS Version Windows 10 ermitteln.

  Alt 6. Sep 2017, 15:36
OS-Version: Windows 10 Enterprise
10.0 - Build 15063
-> Minor-Version lower as expected ! (1)

So ist die Prüfung aber nicht sinnvoll, oder? Weil 10.0 ja größer als 6.1 sein sollte?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 8   « Erste     456 78      


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 16:23 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