|
|
|
|
|
Определение версии DOS и Windows
Функция API GetVersion делает это, но вся информация "кодируется" в longint. Вот как получить и декодировать информацию6:
|
Type
TGetVer = record
WinVer,
WinRev,
DosRev,
DosVer: Byte;
end;
const
VerStr = '%d.%d';
procedure TForm1.Button1Click(Sender: TObject);
var
AllVersions: TGetVer;
begin
AllVersions := TGetVer(GetVersion);
Edit1.Text := Format(VerStr, [AllVersions.WinVer, AllVersions.WinRev]);
Edit2.Text := Format(VerStr, [AllVersions.DOSVer, AllVersions.DOSRev]);
end;
|
Примечание1: Значения, показываемые в информационном диалоге "О системе", не всегда совпадают со значениями, возвращаемыми описанной API функцией, например, Windows for workgroup (Windows для рабочих груп) возвращается как 3.10, а не как 3.11.
Примечание2: Приложения Win32 вместо функции GetVersion должны использовать фунцию GetVersionEx.
Дополнение
Vasili Pincuk пишет:
В VCLUtils.pas есть прекрасная функция GetWindowsVersion зачем изобретать велосипед ? К тому же пример хорошего стиля программирования. Если уж лень искать в исходниках, то ниже её текст. У меня версия от D3 (без Windows 2000 был бы рад - если кто поделится)
|
function GetWindowsVersion: string; {$IFDEF WIN32} const sWindowsVersion = 'Windows %s %d.%.2d.%.3d %s';
varVer: TOsVersionInfo;
Platform: string[4];
beginVer.dwOSVersionInfoSize := SizeOf(Ver);
GetVersionEx(Ver);
with Ver do begin
case dwPlatformId of
VER_PLATFORM_WIN32s: Platform := '32s';
VER_PLATFORM_WIN32_WINDOWS:
begin
dwBuildNumber := dwBuildNumber and $0000FFFF;
if (dwMajorVersion > 4) or ((dwMajorVersion = 4) and
(dwMinorVersion >= 10)) then Platform := '98'
else Platform := '95';
end;
VER_PLATFORM_WIN32_NT: Platform := 'NT';
end;
Result := Trim(Format(sWindowsVersion, [Platform, dwMajorVersion,
dwMinorVersion, dwBuildNumber, szCSDVersion]));
end;
end;{$ELSE} const sWindowsVersion = 'Windows%s %d.%d';
sNT: array[Boolean] of string[3] = ('', ' NT');
varVer: Longint;
beginVer := GetVersion;
Result := Format(sWindowsVersion, [sNT[not Boolean(HiByte(LoWord(Ver)))],
LoByte(LoWord(Ver)), HiByte(LoWord(Ver))]);
end;{$ENDIF WIN32} |
[000472]
|
|
|
|
|