Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetVersionEx unter Windows 10 (https://www.delphipraxis.net/183179-getversionex-unter-windows-10-a.html)

dGeek 20. Dez 2014 23:00

AW: GetVersionEx unter Windows 10
 
Zitat:

Ein 8.0 lässt sich auch mit GetVersionEx korrekt erkennen, 8.1 und höher nur dann, wenn die Applikation ein Manifest mit passender Kompatibilität aufweist.
Ich hatte es eben mal unter Windows 10 getestet und dort wird Windows von meiner Software korrekt erkannt, obwohl ich GetVersionEx(W) nutze.
Spezielle Manifeste nutze ich nicht :?

Dalai 21. Dez 2014 01:17

AW: GetVersionEx unter Windows 10
 
Zitat:

Zitat von dGeek (Beitrag 1284241)
Zitat:

Ein 8.0 lässt sich auch mit GetVersionEx korrekt erkennen, 8.1 und höher nur dann, wenn die Applikation ein Manifest mit passender Kompatibilität aufweist.
Ich hatte es eben mal unter Windows 10 getestet und dort wird Windows von meiner Software korrekt erkannt, obwohl ich GetVersionEx(W) nutze.
Spezielle Manifeste nutze ich nicht :?

Da gibt es nur 3 Möglichkeiten:
  • kein GetVersionEx benutzt bzw. (nur) die neuen Funktionen
  • das Manifest gibt Kompatibilität mit Win10 an; das muss ja kein spezielles Manifest sein, k.a. ob irgendein neueres Delphi die Kompatibilität im Manifest hat, wobei ich das für Win10 nicht so recht glaube (aber wir sind ja hier nicht in der Kirche ;))
  • du benutzt nicht nur GetVersionEx sondern (auch) andere Methoden, wie z.B. die hier im Thread erwähnte Registry
MfG Dalai

himitsu 21. Dez 2014 07:35

AW: GetVersionEx unter Windows 10
 
Zitat:

Zitat von Dalai (Beitrag 1284240)
Ein 8.0 lässt sich auch mit GetVersionEx korrekt erkennen, 8.1 und höher nur dann, wenn die Applikation ein Manifest mit passender Kompatibilität aufweist.

Wenn es das nicht tut, dann wird es wie ein altes Programm behandelt und einige Dinge werden emuliert/umgeleitet, damit es fast so ist, als liefe es in einem alten Windows.
Und somit hat sich das Problem auch gelöst. :roll:

Ob es aber inntelligent ist, das Programm einfach nicht mehr zu starten, nur weil das Windows angeblich zu neu ist, ist auch keine gute Lösung.
> Schadensersatzansprüche?

Dann bringt Mikrosoft ein Windowsupdate raus, das ändert die Version und schon knallt es wieder, weil sich die Version geändert hat.

Eine Warnmeldung wäre ja auch möglich.
Und wie bereits erwähnt, kann man die Zukunft nicht planen, also kann man mit Sicherheit nur auf alte Versionen reagieren und eine Warnung/Funktionsverweigerung explizit auf "bekannte" Probleme ausrichten.
"Sie verwenden Windows 98. Hier gibt bekannte es es Probleme, welche die korekte Funktion des Programms beeinflussen ... Tschüss"

Bernhard Geyer 21. Dez 2014 08:10

AW: GetVersionEx unter Windows 10
 
Zitat:

Zitat von Dalai (Beitrag 1284240)
Zitat:

Zitat von mm1256 (Beitrag 1284218)
Soweit ich das verstehe - also Bitte an die Wissenden: korrigieren wenn ich es falsch verstanden habe - die neue API ist ein Ersatz für die alten Funktionen GetVersion und GetVersionEx ab Windows 8.0. Mit allen vorherigen Versionen funktioniert GetVersion und GetVersionEx nach wie vor.

Ab Win8.1, wobei es möglich ist, dass MS hier seit 8.0 anregte, die neuen Funktionen zu nutzen bzw. die alten nicht zu benutzen. Ein 8.0 lässt sich auch mit GetVersionEx korrekt erkennen, 8.1 und höher nur dann, wenn die Applikation ein Manifest mit passender Kompatibilität aufweist.

Das ist aber schon seit Windows Vista so. Nicht umsonst laufen unsere Anwendungen mit 4 ID für Vista, 7, 8 und 8.1

mm1256 21. Dez 2014 10:20

AW: GetVersionEx unter Windows 10
 
Zitat:

Zitat von himitsu (Beitrag 1284257)
Und wie bereits erwähnt, kann man die Zukunft nicht planen, also kann man mit Sicherheit nur auf alte Versionen reagieren....

Die Formulierung "die Zukunft zu planen" gefällt mir :thumb:

Mein Versuch das zu tun sieht so aus:

Delphi-Quellcode:

function WindowsBuildFromRegistry: Boolean;
var
  s: string;
begin
  Result := false;
  with TRegistry.Create(KEY_EXECUTE) do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKeyReadOnly(rsRegWinVerInfoKey) then
    try
      OSInfo.dwBuildNumber := Cardinal(StrToIntDef(ReadString('CurrentBuildNumber'),0));
      Result := true;
    except
    end;
    CloseKey;
  finally
    Free;
  end;
end;

function GetWinVersion: TWinVersion;
begin
  Result := WinUnknown;
  case OSInfo.dwPlatformId of
    VER_PLATFORM_WIN32s : Result := Win32s;
    VER_PLATFORM_WIN32_WINDOWS : begin
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 0)
      then Result := Win95;
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 10)
      then Result := Win98;
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 90)
      then Result := WinME;
    end;{-VER_PLATFORM_WIN32_WINDOWS-}
    VER_PLATFORM_WIN32_NT: begin
      if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 0)
      then Result := WinNT;
      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 0)
      then Result := Win2000;
      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 1)
      then Result := WinXP;
      if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 2) then
      begin
        if GetSystemMetrics(SM_SERVERR2) <> 0
        then Result := Win2003R2 else
        if (OSInfo.wProductType = VER_NT_WORKSTATION)
        then Result := WinXP64 else
        if OSInfo.wSuiteMask = VER_SUITE_WH_SERVER
        then Result := WinHomeSrv
        else Result := Win2003;
      end;
      if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 0) then
      begin
        if (OSInfo.wProductType = VER_NT_WORKSTATION)
        then Result := WinVista
        else Result := Win2008;
      end;
      if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 1) then
      begin
        if (OSInfo.wProductType = VER_NT_WORKSTATION)
        then Result := Win7
        else Result := Win2008R2;
      end;
      if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 2) then
      begin
        if WindowsBuildFromRegistry then begin
          case OSInfo.dwBuildNumber of
            9200 : case OSInfo.wProductType of
                     VER_NT_WORKSTATION      : Result := Win8;
                     VER_NT_DOMAIN_CONTROLLER : Result := Win2012;
                     VER_NT_SERVER           : Result := Win2012;
                   end;
            9600 : case OSInfo.wProductType of
                     VER_NT_WORKSTATION      : Result := Win81;
                     VER_NT_DOMAIN_CONTROLLER : Result := Win2012R2;
                     VER_NT_SERVER           : Result := Win2012R2;
                   end;
            9841..9880 : Result := Windows10; // Die Preview ist aktuell bei Build 9879
          end;
        end;
      end;
    end;{-VER_PLATFORM_WIN32_NT-}
  end;
end;
Wobei die Manifeste natürlich mit jeder neuen Win-Version angepasst werden.

[edit]Die Windows-Version-Prüfung habe ich natürlich in eine DLL ausgelagert, d.h. wenn z.B. in Kürze ein neues Buid der 10-er Preview kommt, dann tausche ich einfach die DLL aus und muss nicht gleich die komplette App neu compilieren

Insider2004 21. Dez 2014 10:42

AW: GetVersionEx unter Windows 10
 
Übertreibt ihr nicht ein wenig? Ich hatte seit 20 Jahren nie die Notwendigkeit, die Windows Version abzufragen. Mein Zeugs ist so gemacht, dass es auf allen Windowsen läuft.

mm1256 21. Dez 2014 10:57

AW: GetVersionEx unter Windows 10
 
Nun, "laufen" ist die eine Sache, aber wie löst du OS-Abhängige Situationen, z.B. wenn deine App unter normalem Userkontext läuft, und du eine App mit Admin-Rechten starten musst. Ein Beispiel, wie ich meine, wo man das OS kennen sollte oder muss:

Delphi-Quellcode:
{------------------------------------------------------------------------------}
{-- Anwendung starten, wenn nötig mit Admin-Rechten                         --}
{------------------------------------------------------------------------------}
function RuWin_ShellExec(aHandle: HWND; FileName, Parameters, Directory: string;
                         ShowCmd: Integer; AsAdmin, Wait: boolean): Boolean;
var
  SEI: TShellExecuteInfo;
begin
  FillChar(SEI, SizeOf(SEI), #0);
  SEI.cbSize := SizeOf(SEI);
  SEI.Wnd := aHandle;
  SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
  {-Bis zu XP "AsAdmin" automatisch ignorieren-}
  if WindowsVersion < WinVista then AsAdmin := false;
  if AsAdmin
  then SEI.lpVerb := 'runas'
  else SEI.lpVerb := 'open';
  SEI.lpFile := PChar(FileName);
  SEI.lpParameters := PChar(Parameters);
  SEI.lpDirectory := PChar(Directory);
  SEI.nShow := ShowCmd;
  Result := ShellExecuteEx(@SEI);
  if Result then
  if Wait then begin
    if SEI.hProcess > 32 then begin
      WaitForInputIdle(SEI.hProcess, INFINITE);
      WaitForSingleObject(SEI.hProcess, INFINITE);
    end;
  end;
  CloseHandle(SEI.hProcess);
end;
Oder, wie löst man das besser?

Bernhard Geyer 21. Dez 2014 11:12

AW: GetVersionEx unter Windows 10
 
Zitat:

Zitat von mm1256 (Beitrag 1284270)
Nun, "laufen" ist die eine Sache, aber wie löst du OS-Abhängige Situationen,

Für einfache Anwendungen beschränkt man sich halt auf das kleinest OS.
Und mit dynamischen Laden der API-Einsprungspunkte kann man auch einiges abfangen.

greenmile 21. Dez 2014 11:44

AW: GetVersionEx unter Windows 10
 
Ich finde das alles ein wenig Overkill. Ich binde die Ressource mit $R ein und gut is'. So schnell kommen keine neuen Windows Versionen und falls mal eine ganz plötzlich um die Ecke kommt passe ich meine Ressource an. Ist mir lieber als Registry-Einträge zu lesen, die können morgen auch weg sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:12 Uhr.
Seite 4 von 4   « Erste     234   

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