Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Определение Service Pack Windows


Автор: PRF 19.3.2008, 22:07
Здравствуйте!! У меня такой вопрос : "Как можно определить Service pack в windows??", для определения самой windows есть структура TOsVersionInfo, в справке нашел что существует идентичная структура + несколько полей структуры для определения Service Pack, структура имеет схожее имя TOsVersionInfoEX, но при объявлении переменной типа этой структуры(TOsVersionInfoEX) делфи пишет, что не существует такой, хотя в справке она есть и метод GetVersionEX. В делфи есть только TOsVersionInfo, TOsVersionInfoA, TOsVersionInfoW.
Подскажите какую структуру использовать, а точнее почему в справке есть, а на деле нет, мне не нужен сам код, просто не могу объявить переменную!!!
Заранее спасибо!!
Делфи 2007!!

Автор: Alix 19.3.2008, 22:36
Не знаю как в 2007, а в 7 дельфе я не нашел описания расширенной структуры. Однако, никто не мешает написать ее самому, вот так она описана в MSDN:
Код
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;

Автор: PRF 19.3.2008, 22:46
расширенную структуру я имел ввиду эту - а работать поля этой структуры будут соответствующим образом, как написано в MSDN??

Автор: Alix 19.3.2008, 22:57
Когда ты передаешь эту структуру GetVersionEx, то она смотрит на значение ее поля dwOSVersionInfoSize и в зависимости от значения понимает, что перед ней - OSVERSIONINFOEX или просто OSVERSIONINFO. Поэтому перед вызовом нужно будет присвоить этому полю значение sizeof(TOSVersionInfoEx).

Автор: PRF 19.3.2008, 22:59
Спасибо, попробую!!

Автор: PRF 20.3.2008, 00:21
Ребята чего то не получается, я написал эту структуру, вот код 
Код

OSVERSIONINFOEX = record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion : DWORD;
    dwMinorVersion : DWORD;
    dwBuildNumber : DWORD;
    dwPlatformId : DWORD;
    szCSDVersion : array [0..128] of Char;
    wServicePackMajor : WORD;
    wServicePackMinor : WORD;
    wSuiteMask : WORD;
    wProductType : Byte;
    wReserved : Byte;
  end;

......


var
FServicePack : OsVersionInfoEX;
begin
FServicePack.dwOSVersionInfoSize := SizeOf(OsVersionInfoEX);
GetVersionEx(OsVersionInfoEX);  // здесь выдает ошибку '('expected but')' found



что я не так делаю???

Автор: dumb 20.3.2008, 08:07
Код
GetVersionEx(FServicePack);



Автор: PRF 20.3.2008, 12:08
А что вы скажете на изменение исходного подключаемого модуля WIndows.pas в котором находиться функция OsVErsionInfo, я просто к этой функции добавил недостающие поля(последнии поля для опредления сервис пака), и потом объявил переменную OsVersionInfo, все заработало!! можно так сделать??

Автор: Alix 20.3.2008, 12:09
Цитата(PRF @  20.3.2008,  00:21 Найти цитируемый пост)
Код
szCSDVersion : array [0..128] of Char;

это не верно, должно быть [0..127] или [1..128] ну и плюс то, что dumb написал.

Добавлено через 1 минуту и 33 секунды
сделать так можно, но не стоит менять исходники стандартных модулей, потому что тогда нет гарантий, что твоя программа хотя бы скомпилируется на другом компьютере, так что описывай структуру сам в своей программе.

Добавлено через 5 минут и 41 секунду
и еще лучше использовать тогда AnsiChar, если описывается OSVERSIONINFOA и WideChar, если OSVERSIONINFOW. По-умолчанию TOSVersionInfo = TOSVersionInfoA

Автор: PRF 20.3.2008, 13:36
если писать как dumb то выводит такую ошибку: 
types of actual and formal var parameters much be identical

Автор: Alix 20.3.2008, 13:46
ясно... в общем вот рабочий кусок кода:
Код
type
  TOSVersionInfoEx = record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion : DWORD;
    dwMinorVersion : DWORD;
    dwBuildNumber : DWORD;
    dwPlatformId : DWORD;
    szCSDVersion : array [0..127] of AnsiChar;
    wServicePackMajor : WORD;
    wServicePackMinor : WORD;
    wSuiteMask : WORD;
    wProductType : Byte;
    wReserved : Byte;
  end;

function GetVersionEx(var lpVersionInformation: TOSVersionInfoEx): BOOL; stdcall; 
  external kernel32 name 'GetVersionExA';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  OSVersionInfoEx : TOSVersionInfoEx;

begin
  ZeroMemory(@OSVersionInfoEx, sizeof(TOSVersionInfoEx));
  OSVersionInfoEx.dwOSVersionInfoSize := sizeof(TOSVersionInfoEx);

  GetVersionEx(OSVersionInfoEx);

  with OSVersionInfoEx do
    ShowMessage(format('ServicePack: %d.%d', [wServicePackMajor, wServicePackMinor]));
end;

Автор: Poseidon 20.3.2008, 14:07
Хм.

А что у нас тут: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion ?

Автор: PRF 20.3.2008, 14:49
Poseidon спасибо, всем спасибо!! Кстати никто не может дать ссылку на подробную информацию о реестре, что где храниться, только чтобы подробно было!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)