Получение версии Windows

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Получение версии Windows

Сообщение mirk » 07.05.2014 11:56:34

Пытаюсь получить информацию о версии 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?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Получение версии Windows

Сообщение mirk » 07.05.2014 14:21:48

Странно, но я не вижу 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, т.е. не то что надо.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Получение версии Windows

Сообщение mirk » 13.05.2014 15:01:50

Спасибо, разобрался.
А как получить тип операционной системы (Professional, Ultimate и т.п.)?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Получение версии Windows

Сообщение Vadim » 13.05.2014 16:08:07

Код: Выделить всё
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName

:)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Получение версии Windows

Сообщение mirk » 13.05.2014 16:44:44

У меня там указано только "Microsoft Windows XP", а "Professional" нет.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Получение версии Windows

Сообщение Дож » 13.05.2014 17:04:22

Здесь таблица в части Remarks

Updated похоже, что это не поможет различить разновидности XP. Быть может, у дистрибутивов XP нет существенной разницы в системе?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Получение версии Windows

Сообщение mirk » 13.05.2014 17:17:08

Дож писал(а):Здесь таблица в части Remarks

Там нет редакций, только версии.

Нашел функцию GetProductInfo
Но не очень понятна ее работа - зачем ей знать версии OS и SP?
Да и все равно FPC не знает такой функции :(

Добавлено спустя 15 минут 47 секунд:
GetProductInfo не подходит, она только с Vista начинает идти :(
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Получение версии Windows

Сообщение mirk » 14.05.2014 11:49:29

А как такое же узнать под XP?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru