... 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 ?