![]() |
AW: GetVersionEx unter Windows 10
Zitat:
Spezielle Manifeste nutze ich nicht :? |
AW: GetVersionEx unter Windows 10
Zitat:
|
AW: GetVersionEx unter Windows 10
Zitat:
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" |
AW: GetVersionEx unter Windows 10
Zitat:
|
AW: GetVersionEx unter Windows 10
Zitat:
Mein Versuch das zu tun sieht so aus:
Delphi-Quellcode:
Wobei die Manifeste natürlich mit jeder neuen Win-Version angepasst werden.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; [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 |
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.
|
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:
Oder, wie löst man das besser?
{------------------------------------------------------------------------------}
{-- 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; |
AW: GetVersionEx unter Windows 10
Zitat:
Und mit dynamischen Laden der API-Einsprungspunkte kann man auch einiges abfangen. |
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 02:22 Uhr. |
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 by Thomas Breitkreuz