Если требуется более подробная информация о Windows, то, как уже было
сказано, удобнее работать с более современной функцией GetVersionEx:
function GetVersionEx(var lpVersionlnformation: TOSVersionInfo): BOOL; stdcall;
Ее единственный параметр указывает запись типа TOSVersionInfo. Поля
этой
записи содержат следующую информацию: Поле | Описание | DwOSVersionlnfoSize:
DWORD | Размер записи. Должен задаваться до вызова
GetVersionEx. | dwMajorVersion: DWORD | Основной
номер версии. | dwMinorVersion: DWORD | Дополнительный
номер версии. | dwBuildNumber: DWORD | Для Windows
NT — номер модификации. Для
Windows 9.x младшее слово — номер модификации, старший байт старшего
слова — основной
номер версии (то же, что dwMajorVersion),
младший байт старшего слова — дополнительный номер версии (то же, что
dwMinorVersion). | dwPlatformld: DWORD | Платформа
операционной системы:
VER_PLATFORM_WIN32S —
Windows 3.1 с Win32s,
VER_PLATFORM_WIN32_WINDOWS —
Windows 9x, VER_PLATFORM_WIN32_NT —
Windows NT 2000/XP) с Win32. | szCSDVersion:
array[0..127] of AnsiChar
В VCL.NET:
szCSDVersion: string | Необязательная дополнительная информация.
|
При использовании функции
GetVersionEx пример дешифрации информации о Windows, аналогичный
приведенному ранее, может выглядеть так:
function GetWindowsVersionEx: string; var OSVer: TOSVersionlnfo; S: string; begin OSVer.dwOSVersionlnfoSize := SizeOf(TOSVersionlnfo); if not GetVersionEx(OSVer) then begin Result := GetWindowsVersion; exit; end; GetVersionEx(OSVer); case OSVer.dwPlatformld of VER_PLATFORM_WIN32s: S := 'Windows 3.1'; VER_PLATFORM_WIN32_WINDOWS: if OSVer.dwMajorVersion = 4 then case OSVer.dwMinorVersion of 0: S := 'Windows 95'; 10: if OSVer .'SzCSDVersion [1] = 'A' then S := 'Windows 98SE' else S := 'Windows 98'; 90: S := 'Windows ME'; else S := 'Неизвестная версия Windows 9x'; end; VER_PLATFORM_WIN32_NT: case OSVer.dwMajorVersion of 4: S := 'Windows NT' ; 5: if OSVer.dwMinorVersion = 0 then S := 'Windows 2000' else if OSVer.dwMinorVersion = 1 then S := 'Windows XP' else S := 'Неизвестная версия Windows NT'; else S := 'Неизвестная версия Windows NT'; end; end; Result := S + ', модификация ' + IntToStr(OSVer.dwBuildNumber); end; procedure TForml.Button2Click(Sender: TObject); begin Memol.Text := GetWindowsVersion; end;
Просмотрев этот код, вы увидите, что означают и как надо
анализировать поля записи TOSVersionlnfo. Обратите внимание, что в
приведенном коде функции GetWindowsVersionEx проверяется значение,
возвращаемое библиотечной функцией GetVersionEx, и если вызов
GetVersionEx закончился неудачей, то вызывается рассмотренная ранее
функция GetWindowsVersion. Дело в том, что, в частности в .NET,с
функцией GetVersionEx могут быть проблемы. Так что лучше
подстраховаться.
Еще большие возможности дает вызов функции GetVersionEx с
использованием записи типа TOsVersionInfoEx. Ниже приводится
соответствующий код.
function GetWindowsVersionExEx(var Sdop: string): string; const VER_NT_WORKSTATION = 0; VER_NT_DOMAIN_CONTROLLER = 1; VER_NT_SERVER = 2; VER_SUITE_SMALLBUSINESS = 1; VER_SUITE_ENTERPRISE = 2; VER_SUITE_BACKOFFICE = 4; VER_SUITE_COMMUNICATIONS = 8; VER_SUITE_TERMINAL = $10; VER_SUITE_SMALLBUSINESS_RESTRICTED = $20; VER_SUITE_EMBEDDEDNT = $4 0; VER_SUITE_DATACENTER = $80; VER_SUITE_SINGLEUSERTS = $100; VER_SUITE_PERSONAL = $200; VER_SUITE_BLADE = $400; type TOsVersionlnfoEx = packed record old : TOsVersionlnfo; wServicePackMajor : Word; wServicePackMinor : Word; wSuiteMask : Word; wProductType : Byte; wReserved : Byte; end; var Verlnfo : TOsVersionlnfoEx; S: string; begin Sdop := FillChar(Verlnfo, sizeof(Verlnfo), 0) ; Verlnfo.old.dwOSVersionlnfoSize := Sizeof(TOsVersionlnfoEx); if not GetVersionEx(Verlnfo.old) then begin Result := GetWindowsVersion; exit; end; S := GetWindowsVersion; case Verlnfo.wProductType of VER_NT_WORKSTATION: if (Copy(S, 1, Pos(',',S)) = 'Windows NT1) then Sdop := Sdop + 'Операционная система Windows NT 4.0 Workstation. ' else if (Copy(S, 1, Pos(',',S)) = 'Windows 2000') then Sdop := Sdop + 'Операционная система Windows 2000 Professional. ' else if (Copy(S, 1, Pos(!,',S)) = 'Windows XP') then Sdop := Sdop + 'Операционная система Windows XP Professional. '; VER_NT_DOMAIN_CONTROLLER: Sdop := Sdop + 'Операционная система является контроллером домена. '; VER_NT_SERVER: Sdop := Sdop + 'Операционная система является сервером. '; end; if Verlnfo.wSuiteMask and VER_SUITE_BACKOFFICE > 0 then Sdop := Sdop + 'Установлен компонент Microsoft BackOffice. '; if Verlnfo.wSuiteMask and VER_SUITE_BLADE > 0 then Sdop := Sdop + 'Установлен компонент Windows .NET Web Server. '; if Verlnfo.wSuiteMask and VER_SUITE_DATACENTER > 0 then Sdop := Sdop + 'Установлены Windows 2000 или компонент Windows .NET ' + 'Datacenter Server. '; if Verlnfo.wSuiteMask and VER_SUITE_DATACENTER > 0 then Sdop := Sdop + 'Установлен Windows 2000 Advanced Server ' + 'или компонент Windows .NET Enterprise Server. '; if Verlnfo.wSuiteMask and VER_SUITE_PERSONAL > 0 then Sdop := Sdop + 'Установлена версия Windows XP Home Edition. '; if Verlnfo.wSuiteMask and VER_SUITE_SMALLBUSINESS > 0 then Sdop := Sdop + 'Установлен Microsoft Small Business Server. '; if Verlnfo.wSuiteMask and VER_SUITE_SMALLBUSINESS_RESTRICTED > 0 then Sdop := Sdop + 'Установлен Microsoft Small Business ' + 'Server с ограничительной лицензией для клиентовю '; if Verlnfo.wSuiteMask and VER_SUITE_TERMINAL > 0 then Sdop := Sdop + 'Установлен компонент Terminal Services. '; Result := S; end; procedure TForml.Button4Click(Sender: TObject); var Sdop: string; begin Memol.Clear; Memol.Lines.Add(GetWindowsVersionExEx(Sdop)); if SDop<>'' then Memol.Lines.Add(Sdop); Memol.SelStart := 1; Memol.Perform(EM_SCROLLCARET, 0, 0); end;
Работа с функцией GetVersionEx с использованием записи типа
TOsVersionlnfoEx оформлена в виде функции GetWindowsVersionExEx. Она
возвращает строку характеристики операционной системы, вызывая описанную
ранее функцию Get Windows Version. А если удается, то в параметр Sdop
возвращается строка дополнительной информации. Схема работы с функцией
GetVersionEx с использованием записи типа TOsVersionlnfoEx выглядит так.
Объявляется тип TOsVersionlnfoEx так, как показано в приведенном коде.
Поле old — это запись рассмотренного ранее типа TOsVersionlnfo. А
остальные поля записи позволяют получить дополнительную информацию об
операционной системе, как видно из приведенного кода.
Перед вызовом GetVersionEx в поле dwOSVersionlnfoSize записи, на
которую указывает поле old, заносится размер записи TOsVersionlnfoEx
(обратите внимание, именно TOsVersionlnfoEx, а не TOsVersionlnfo). Таким
образом, отводится место для дополнительной информации. Далее следует
вызов GetVersionEx с передачей в него записи из поля old. Если вызов
закончился неудачей, значит версия соответствующей системной DLL не
поддерживает выдачу расширенной информации. В этом случае вызывается
описанная ранее функция Get Windows Version, возвращающая стандартную
информацию о системе, и выполнение завершается. Если же вызов
GetVersionEx прошел успешно, то после получения стандартной информации
вызовом функции GetWindowsVersion следует анализ полей wProductType и
wSuiteMask записи типа TOsVersionlnfoEx и в параметр Sdop заносится
дополнительная информация о системе. Параметр wSuiteMask является
комбинацией флагов, определяющих наличие некоторых компонентов
операционной системы. Их смысл, вероятно, ясен из приведенного кода.
Теперь посмотрим, как можно определить, установлена ли на компьютере
.NET Framework, и если установлена, то какой версии. Информация о .NET
Framework хранится в реестре в ключе HKEY_LOCAL_MACHINE \ SOFTWARE \
Microsoft \ .NETFramework. В этом ключе может содержаться один или более
разделов с именами вида "vl.l" и другими, начинающимися с символа "v",
за которым следует номер версии.
Код, обеспечивающий чтение информации об установке .NET Framework,
выглядит так:
uses registry; function NetVersion: TStringList; var R: TRegistry; List: TStringList; i: Integer; const RegKey = 'Software\Microsoft\.NETFramework\Policy'; begin R := TRegistry.Create; List := TStringList.Create; Result := TStringList.Create; R.RootKey := HKEY_LOCAL_MACHINE; try if R.KeyExists(RegKey) then begin R.OpenKeyReadOnly(RegKey); R.GetKeyNames(List) ; R.CloseKey; for i := 0 to List.Count - 1 do if UpCase(List[i][1]) = 'V then Result.Add(Copy(List[i],2,10)); end; if Result.Count = 0 then Result.Add('.NET Framework не установлена') else Result.Insert( 'Установлены версии .NET Framework:'); finally List.Free; R.Free; end; end; procedure TForml.Button5Click(Sender: TObject); var s: string; begin Memol.Lines := NetVersion; end;
В результате работы приведенной функции NetVersion возвращается
список строк, содержащий одну строку .NET Framework не установлена или
строки вида:
Установлены версии .NET Framework: vl.l ...
|