Советы по Delphi

         

Определение версии DOS и Windows


Как мне получить номер версии Windows или DOS?

Функция 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'; var
Ver: TOsVersionInfo; Platform: string[4]; begin
Ver.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'); var
Ver: Longint; begin
Ver := GetVersion; Result := Format(sWindowsVersion, [sNT[not Boolean(HiByte(LoWord(Ver)))], LoByte(LoWord(Ver)), HiByte(LoWord(Ver))]); end;
{$ENDIF WIN32}

[000472]



Содержание раздела