Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение Service Pack Windows 
:(
    Опции темы
PRF
Дата 19.3.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



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


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Не знаю как в 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;



--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
PRF
Дата 19.3.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) PRF - 19.3.2008, 22:48
PM MAIL   Вверх
Alix
Дата 19.3.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
PRF
Дата 19.3.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Спасибо, попробую!!
PM MAIL   Вверх
PRF
Дата 20.3.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Ребята чего то не получается, я написал эту структуру, вот код 
Код

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



что я не так делаю???
PM MAIL   Вверх
dumb
Дата 20.3.2008, 08:07 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Код
GetVersionEx(FServicePack);



PM MAIL   Вверх
PRF
Дата 20.3.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



А что вы скажете на изменение исходного подключаемого модуля WIndows.pas в котором находиться функция OsVErsionInfo, я просто к этой функции добавил недостающие поля(последнии поля для опредления сервис пака), и потом объявил переменную OsVersionInfo, все заработало!! можно так сделать??
PM MAIL   Вверх
Alix
Дата 20.3.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Цитата(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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
PRF
Дата 20.3.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



если писать как dumb то выводит такую ошибку: 
types of actual and formal var parameters much be identical
PM MAIL   Вверх
Alix
Дата 20.3.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



ясно... в общем вот рабочий кусок кода:
Код
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;



--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 20.3.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Хм.

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PRF
Дата 20.3.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Poseidon спасибо, всем спасибо!! Кстати никто не может дать ссылку на подробную информацию о реестре, что где храниться, только чтобы подробно было!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.