Страница 1 из 1
Получение версии Windows
Добавлено: 07.05.2014 11:56:34
mirk
Пытаюсь получить информацию о версии Windows.
В MSDN описана функция
GetVersionEx и возможная получаемая структура
OSVERSIONINFOEX:
Код: Выделить всё
typedef struct _OSVERSIONINFOEX {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[128];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
Но в FPC в
getVersionEx ожидает
OSVERSIONINFO:
Код: Выделить всё
Error: Call by var for arg no. 1 has to match exactly: Got "_OSVERSIONINFOEXW" expected "OSVERSIONINFOW"
Как получить именно
_OSVERSIONINFOEX?
Re: Получение версии Windows
Добавлено: 07.05.2014 13:53:35
Дож
Странно, но я не вижу EX версии структуры (в транке).
А вообще, это делается как-то так:
Код: Выделить всё
uses
windows;
{$if not declared(_OSVERSIONINFOEXW)}
type
_OSVERSIONINFOEXW = record
dwOSVersionInfoSize: ULONG;
dwMajorVersion: ULONG;
dwMinorVersion: ULONG;
dwBuildNumber: ULONG;
dwPlatformId: ULONG;
szCSDVersion: array[0..127] of WCHAR; // Maintenance string for PSS usage
wServicePackMajor: USHORT;
wServicePackMinor: USHORT;
wSuiteMask: USHORT;
wProductType: UCHAR;
wReserved: UCHAR;
end;
{$endif}
var
Info: _OSVERSIONINFOEXW;
begin
fillchar(Info, SizeOf(Info), 0);
Info.dwOSVersionInfoSize := SizeOf(Info);
if GetVersionExW(POSVERSIONINFOW(@Info)) then
Writeln(Info.wServicePackMajor, ':', Info.wServicePackMinor);
end.
Re: Получение версии Windows
Добавлено: 07.05.2014 14:21:48
mirk
Странно, но я не вижу EX версии структуры (в транке).
Опеределение структуры находится в файле
jwanative:
Код: Выделить всё
{$IFNDEF JWA_INCLUDEMODE}
type
_OSVERSIONINFOEXW = record
dwOSVersionInfoSize: ULONG;
dwMajorVersion: ULONG;
dwMinorVersion: ULONG;
dwBuildNumber: ULONG;
dwPlatformId: ULONG;
szCSDVersion: array[0..127] of WCHAR; // Maintenance string for PSS usage
wServicePackMajor: USHORT;
wServicePackMinor: USHORT;
wSuiteMask: USHORT;
wProductType: UCHAR;
wReserved: UCHAR;
end;
А вообще, это делается как-то так:
Да, именно так и делаю. Но возвращается ошибка (Got "_OSVERSIONINFOEXW" expected "OSVERSIONINFOW").
uses windows;
Если оставлять только этот модуль, то при переходе на GetVersionEx получается
Код: Выделить всё
function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL;external 'kernel32' name 'GetVersionExA';
а TOSVersionInfo эквивалентно OSVERSIONINFOA, т.е. не то что надо.
Re: Получение версии Windows
Добавлено: 07.05.2014 17:49:30
Дож
Да, именно так и делаю. Но возвращается ошибка (Got "_OSVERSIONINFOEXW" expected "OSVERSIONINFOW").
Мой код компилируется и выполняется.
Код: Выделить всё
C:\data\temp>fpc wtest.pp && wtest.exe
Free Pascal Compiler version 2.7.1 [2013/11/19] for i386
Copyright (c) 1993-2013 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling wtest.pp
Linking wtest.exe
28 lines compiled, 0.2 sec, 27680 bytes code, 1252 bytes data
1:0
Re: Получение версии Windows
Добавлено: 13.05.2014 15:01:50
mirk
Спасибо, разобрался.
А как получить тип операционной системы (Professional, Ultimate и т.п.)?
Re: Получение версии Windows
Добавлено: 13.05.2014 16:08:07
Vadim
Код: Выделить всё
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName

Re: Получение версии Windows
Добавлено: 13.05.2014 16:44:44
mirk
У меня там указано только "Microsoft Windows XP", а "Professional" нет.
Re: Получение версии Windows
Добавлено: 13.05.2014 17:04:22
Дож
Здесь таблица в части Remarks
Updated похоже, что это не поможет различить разновидности XP. Быть может, у дистрибутивов XP нет существенной разницы в системе?
Re: Получение версии Windows
Добавлено: 13.05.2014 17:32:55
mirk
Дож писал(а):Здесь таблица в части Remarks
Там нет редакций, только версии.
Нашел функцию
GetProductInfoНо не очень понятна ее работа - зачем ей знать версии OS и SP?
Да и все равно FPC не знает такой функции
Добавлено спустя 15 минут 47 секунд:GetProductInfo не подходит, она только с Vista начинает идти

Re: Получение версии Windows
Добавлено: 13.05.2014 17:37:08
Дож
Объявить функцию не проблема:
Код: Выделить всё
{$MODESWITCH Out}
uses
windows;
{$if not declared(_OSVERSIONINFOEXW)}
type
_OSVERSIONINFOEXW = record
dwOSVersionInfoSize: ULONG;
dwMajorVersion: ULONG;
dwMinorVersion: ULONG;
dwBuildNumber: ULONG;
dwPlatformId: ULONG;
szCSDVersion: array[0..127] of WCHAR; // Maintenance string for PSS usage
wServicePackMajor: USHORT;
wServicePackMinor: USHORT;
wSuiteMask: USHORT;
wProductType: UCHAR;
wReserved: UCHAR;
end;
{$endif}
{$if not declared(GetProductInfo)}
function GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; out pdwReturnedProductType: DWORD): Boolean; stdcall; external 'Kernel32.dll';
{$endif}
var
Info: _OSVERSIONINFOEXW;
ProductType: DWORD;
begin
fillchar(Info, SizeOf(Info), 0);
Info.dwOSVersionInfoSize := SizeOf(Info);
if not GetVersionExW(POSVERSIONINFOW(@Info)) then
Halt(1);
with Info do
if GetProductInfo(dwMajorVersion, dwMinorVersion, wServicePackMajor, wServicePackMinor, ProductType) then
Writeln(ProductType);
end.
Re: Получение версии Windows
Добавлено: 14.05.2014 11:49:29
mirk
А как такое же узнать под XP?