Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как выдрать инфу о версии из файла

1.9K
27 сентября 2004 года
free_lexx
22 / / 29.05.2003
Ниже приведен раздобытый мною на задворках инета код, который вытаскивает версию проги из файла.
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?
Код:
var len: Cardinal;
    p: pointer;
    p2: PVSFixedFileInfo;
    h: DWORD;
    l: UINT;
    Major1, Major2,Minor1, Minor2: Integer;
begin
  len:=GetFileVersionInfoSize(pchar(Application.exename),h);
  GetMem(p,len);
  try
    GetFileVersionInfo(pchar(Application.exename),0,len,p);
    VerQueryValue(p,'\',Pointer(p2),l);
    Major1 := p2.dwFileVersionMS shr 16;
    Major2 := p2.dwFileVersionMS and $FFFF;
    Minor1 := p2.dwFileVersionLS shr 16;
    Minor2 := p2.dwFileVersionLS and $FFFF;
    Label5.Caption:=IntToStr(Major1)+'.'+IntToStr(Major2)+'.'+IntToStr(Minor1)+'.'+IntToStr(Minor2);
    VerQueryValue(p,'\',Pointer(p2),l);
  finally
    FreeMem(p);
  end;
end
302
27 сентября 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by free_lexx
Ниже приведен раздобытый мною на задворках инета код, который вытаскивает версию проги из файла.
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?


Пример из хелпа по WinAPI. Достает описание файла. Таким же образом можешь достать все остальное.

 
Код:
VerQueryValue(pBlock,  
              TEXT("\\StringFileInfo\\040904E4\\FileDescription"),
              &lpBuffer,
              &dwBytes);
1.9K
28 сентября 2004 года
free_lexx
22 / / 29.05.2003
Цитата:
Originally posted by Sagittarius

Пример из хелпа по WinAPI. Достает описание файла. Таким же образом можешь достать все остальное.
 
Код:
VerQueryValue(pBlock,  
              TEXT("\\StringFileInfo\\040904E4\\FileDescription"),
              &lpBuffer,
              &dwBytes);


Это все понятно, хэлп по ВинАПИ я тоже читал...
Тока там не написано что это за параметр такой lpBuffer.
Вообще Дельфи говорит что на месте &lpBuffer должен стоять Pointer, но как из него потом строку зафигачить?

302
28 сентября 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by free_lexx

Это все понятно, хэлп по ВинАПИ я тоже читал...
Тока там не написано что это за параметр такой lpBuffer.
Вообще Дельфи говорит что на месте &lpBuffer должен стоять Pointer, но как из него потом строку зафигачить?


lpBuffer - это массив, всего лишь обычный массив типа char. Объяви его так: buf: Array [1..1024] of Char, например.
Потом передавай его в параметрах как указатель на первый жлемент массива (@buf[1]), в качестве значения pwBytes передай SizeOf(buf)

10
29 сентября 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by free_lexx
Вопрос: а как вытащить инфу об организации, копирайте и комментарии (в опциях проекта она тоже прописыватся)?


Найди где-нить в Сети библиотеку RxLib. Она поставляется в исходниках. В RxVerInfo есть работающий класс для доступа к информации о версии.

Даже если она не будет у тебя ставиться, можешь хотя бы посмотреть код, как там было реализовано.

1.9K
11 октября 2004 года
free_lexx
22 / / 29.05.2003
Цитата:
Originally posted by Sagittarius

lpBuffer - это массив, всего лишь обычный массив типа char. Объяви его так: buf: Array [1..1024] of Char, например.
Потом передавай его в параметрах как указатель на первый жлемент массива (@buf[1]), в качестве значения pwBytes передай SizeOf(buf)


Не, не катит такая фишка. Дельфи ругается, что тип неправильный (на @buf[1])
А в качстве значения dwBytes ниче передавать не нужно, это параметр-переменная, функция туда возвращает размер строки.

1.9K
11 октября 2004 года
free_lexx
22 / / 29.05.2003
Цитата:
Originally posted by smartsoft

Найди где-нить в Сети библиотеку RxLib. Она поставляется в исходниках. В RxVerInfo есть работающий класс для доступа к информации о версии.

Даже если она не будет у тебя ставиться, можешь хотя бы посмотреть код, как там было реализовано.


Большое спасибо SmartSoft'у. Ты вылечил мой трабл.
Для всех итересующихся привожу работоспособный пример (Delphi 7.0 Enterprise под Win2000 SP3)

Код:
var
  n, Len: DWORD;
  Buf: PChar;
  Value,p: Pointer;
  s:string;
begin
  S := Application.ExeName;
  n := GetFileVersionInfoSize(PChar(S), n);
  if n > 0 then
  begin
    Buf := AllocMem(n);
    GetFileVersionInfo(PChar(S), 0, n, Buf);
    VerQueryValue(Buf,'\VarFileInfo\Translation', p, Len);
    s:=IntToHex(MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^))),8 );
    if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\ProductName'), Value, Len)
      then  Label1.Caption:=StrPas(PChar(Value))
      else Label1.Caption:='';
    if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\ProductVersion'), Value, Len)
      then  Label2.Caption:=StrPas(PChar(Value))
      else Label2.Caption:='';
    if VerQueryValue(Buf, PChar('\StringFileInfo\' + s + '\CompanyName'), Value, Len)
      then  Label3.Caption:=StrPas(PChar(Value))
      else Label3.Caption:='';
    FreeMem(Buf, n);
  end;
end;

Всем удачи!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог