Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение информации о EXE [D7, Win95/98, WinXP]


Nike ©   (2006-02-06 06:59:00) 

Здравствуйте! Меня интересует следующий вопрос - как можно получить информацию о версии файла с помощью функции GetFileVersionInfo? Конкретно мне необходимо получить FileDescription на первом из языков, описания на которых хранятся в файле. Если я вызываю
VerQueryValue(pcBuf, PChar('StringFileInfo\040904E4\FileDescription')
то если описание в файле хранится, к примеру, на русском языке, функция ничего не возращает. Как тогда мне получить описание на имеющемся языке? Или хотя бы узнать язык и раскладку, на которых в файле хранятся данные.


Nike   (2006-02-10 12:58:00) [1]

To begin...end:
И где можно найти "свежую offline-версию MSDN" за приемлемую цену? Учитывая то, что нахожусь я на периферии (поблизости ниодного майкрософтовского офиса). Конечно, желательно бы бесплатно и посвежее..


begin...end   (2006-02-08 13:25:00) [2]

> Nike   (08.02.06 07:41) [5]
> Или Майкрософт дает Борланду лишь "урезанную версию" хелпа?

Конечно. Поэтому лучше пользоваться сайтом www.msdn.com или приобрести свежую offline-версию MSDN.


Nike   (2006-02-08 07:41:00) [3]

To begin...end:
Спасибо, этот пример, похоже, как раз то что мне и нужно. Кстати, почему в хелпе к Delphi (у меня 7-я) такого примера нету? Может нужна обновленная версия хелпа (MS SDK)???? Или Майкрософт дает Борланду лишь "урезанную версию" хелпа?


begin...end   (2006-02-07 12:13:00) [4]

> Nike   (07.02.06 11:17) [3]

> мне надо получить FileDescription, а в записи типа PVSFixedFileInfo
> такая информация не хранится

Хранится: "\FileDescription".

> Мне необходимо узнать, на каком языке хранятся эти данные.

Вызывайте VerQueryValue с параметром '\VarFileInfo\Translation'.

> Можно, конечно, перебрать наиболее "популярные" кодировки,
> но это выглядит чересчур горбато.

Пример в MSDN (внизу страницы -- ShowExample):

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Resources/VersionInformation/VersionInformationReference/VersionInformationFunctions/VerQueryValue.asp

(если ссылка разорвётся, соедините).


Nike   (2006-02-07 11:17:00) [5]

to kaZaNoVa:
Насчет первого примера - мне надо получить FileDescription, а в записи типа PVSFixedFileInfo такая информация не хранится.
Насчет второго - указание строки 'StringFileInfo\040904E4\FileVersion' означает, что из файла будет браться информация только на языке и чарсете, определяемом комбинацией 0x040904E4. Проблема в том, что эта информация может хранится и на другом языке. Мне необходимо узнать, на каком языке хранятся эти данные.
Можно, конечно, перебрать наиболее "популярные" кодировки, но это выглядит чересчур горбато.


kaZaNoVa   (2006-02-06 07:09:00) [6]

еще ..
function FileVersion(fname: string): string;
var
 siz       : Integer;
 buf, value: pChar;
 hndl      : DWORD;
begin
 Result := '?.?.?.?';
 siz := GetFileVersionInfoSize(PChar(fname), hndl);
 if siz > 0 then
 begin
   buf := AllocMem(siz);
   try
     GetFileVersionInfo(PChar(fname), 0, siz, buf);
     if VerQueryValue(buf, pChar('StringFileInfo\040904E4\FileVersion')
       , pointer(value), hndl) then
       Result := value
     else
       if VerQueryValue(buf, pChar('StringFileInfo\040904B0\FileVersion')
         , pointer(value), hndl) then
         Result := value;
   finally
     FreeMem(buf);
   end;
 end;
end;


kaZaNoVa   (2006-02-06 07:07:00) [7]

может это?

// Получение версии программы/библиотеки вида XX.XX

Function GetFileVersion(Const FileName: String): String;
Type
 TFileVersion = Packed Record
   Case Integer Of
     0: (Ver64: Int64);
     1: (VerLS, VerMS: DWORD);
     2: (Ver3, Ver2, Ver1, Ver0: Word);
     3: (Build, Release, Minor, Major: Word);
 End;
Var
 VersInfo          : Pointer;
 VersInfoSize      : DWORD;
 FileVersion       : TFileVersion;
 w                 : DWORD;
 FileInfo          : PVSFixedFileInfo;
Begin
 Result := '';
 VersInfoSize := GetFileVersionInfoSize(PChar(FileName), W);
 GetMem(VersInfo, VersInfoSize);
 Try
   If GetFileVersionInfo(PChar(FileName), 0, VersInfoSize, VersInfo) And
     VerQueryValue(VersInfo, '\', Pointer(FileInfo), W) Then
     Begin
       FileVersion.VerMS := FileInfo.dwFileVersionMS;
       FileVersion.VerLS := FileInfo.dwFileVersionLS;
       Result := Int2Str(FileVersion.Major) + '.' + Int2Str(FileVersion.Minor);
     End;
 Finally
   FreeMem(VersInfo);
 End;
End;


Наверх

Титульная страница Поиск, карта сайта Написать письмо