Пятница, 17.05.2024, 11:56
Главная Регистрация RSS
Приветствую Вас, Гость
Главная » Delphi и механизмы Windows » Определение версии Windows и .NET Framework. Часть 2
08:05

Определение версии Windows и .NET Framework. Часть 2

Если требуется более подробная информация о 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
...
Категория: Delphi и механизмы Windows | Просмотров: 1604 | Добавил: PeKpyT | Рейтинг: 0.0/0
Всего комментариев: 1
1 Ramzes  
0
Вот подробная статейка по проверке установленных версий .NET программным путём. Код на C# но думаю адаптировать для Delphi труда не составит.
http://net-framework.ru/article/programmno-opredelit-kakie-versii-ustanovleny

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]