Club Delphi,
Cita:
Empezado por dec
...lo que tenemos que averiguar es si nuestro programa corre o no en Windows 10...
|

Tomado de:
Getting the System Version
Revisa este código:
Código Delphi
[-]
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.StrUtils;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetWindowsKernelVersion : String;
const
FileName : String = 'C:\Windows\System32\Kernel32.dll';
type
PLanguageCodepage = ^TLanguageCodepage;
TLanguageCodepage = record
Language : Word;
CodePage : Word;
end;
var
None, Size: LongWord;
Buffer, Ptr : Pointer;
Lang, AuxStr, Version : String;
WinList : TStringList;
P : Integer;
function IsWindowsServer : Boolean;
var
OSVersion : OSVersionInfoEX;
ConditionMask : Int64;
begin
FillChar(OSVersion, SizeOf(OSVersion), 0);
OSVersion.dwOSVersionInfoSize := SizeOf(OSVersion);
OSVersion.wProductType := VER_NT_WORKSTATION;
ConditionMask := VerSetConditionMask(ConditionMask, VER_PRODUCT_TYPE, VER_EQUAL);
Result := not VerifyVersionInfo(OSVersion, VER_PRODUCT_TYPE, ConditionMask);
end;
begin
Size := GetFileVersionInfoSize(PChar(FileName), None);
if Size = 0 then
Exit;
WinList := TStringList.Create;
WinList.Add('10.0=Windows 10');
WinList.Add('Svr 10.0=Windows Server');
WinList.Add('6.3=Windows 8.1');
WinList.Add('Svr 6.3=Windows Server 2012 R2');
WinList.Add('6.2=Windows 8');
WinList.Add('Svr 6.2=Windows Server 2012');
WinList.Add('6.1=Windows 7');
WinList.Add('Svr 6.1=Windows Server 2008 R2');
WinList.Add('6.0=Windows Vista');
WinList.Add('Svr 6.0=Windows Server 2008');
WinList.Add('5.2=Windows XP x64');
WinList.Add('Svr 5.2=Windows Server 2003');
WinList.Add('5.1=Windows XP');
WinList.Add('5.0=Windows 2000');
WinList.Add('4.0=Windows NT');
Result := '0.0.0.0';
GetMem(Buffer, Size);
try
GetFileVersionInfo(PChar(FileName), 0, Size, Buffer);
VerQueryValue(Buffer, '\VarFileInfo\Translation\', Ptr, Size);
Lang := Format('%.4x%.4x', [PLanguageCodepage(Ptr)^.Language, PLanguageCodepage(Ptr)^.CodePage]);
if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Lang + '\FileVersion'), Ptr, Size) then
begin
AuxStr := PChar(Ptr);
P := PosEx('.',AuxStr,Pos('.',AuxStr)+1);
Version := Copy(AuxStr,1,P-1);
if IsWindowsServer then
Result := WinList.Values['Svr ' + Version] + ' ' + Version
else
Result := WinList.Values[Version] + ' ' + Version;
end;
finally
FreeMem(Buffer);
WinList.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TaskMessageDlg('Windows Version', GetWindowsKernelVersion, mtInformation, [mbOK], 0);
end;
end.
El código anterior en Delphi XE7 sobre Windows 7 Professional x32,
Permite por medio de funciones de Windows (APIs) obtener la versión del SO, como se muestra en la siguiente imagen:
Notas:
1- Esta función es un bit más compleja y rápida que la planteada en el
Msg #2.
2- La función basada en WMI del
Msg #2,
es más simple y expresiva en información.
3- Ambas funciones detectan correctamente la versión de Windows.
Información relacionada:
Espero sea útil
Nelson.