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

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

Как извлечь версию файла из произвольного файла? [Delphi, Windows]


Sormy ©   (2004-06-26 11:32:00) 

Как извлечь версию файла из произвольного файла?
Под KOL есть отдельна фича или через WinAPI надо?


Sormy   (2004-06-28 13:25:00) [1]

2 mdw:

Спасибо! Сам разобрался - все работает прекрасно...
Еще раз огромное спасибо...


Sormy   (2004-06-28 13:17:00) [2]

Стормозил что-то я с точкой :-))
качается все...

А можно небольшой примерчик использования модуля?


Sormy   (2004-06-28 13:14:00) [3]

Да, что-то стормозил я с точкой :-))
Качается все...

А можно небольшой примерчик использования модуля?


Ozone   (2004-06-28 12:45:00) [4]

Sormy   (28.06.04 12:30) [13]

Почку последнюю у лика убери и все заработает


Sormy   (2004-06-28 12:30:00) [5]

Линк не работает.
Если у Вас есть этот модуль, то не могли бы Вы его кинуть мне на мыло sormy|@|mail.ru? Он ведь немного весит?


mdw   (2004-06-28 10:43:00) [6]

Вот попробуй: http://www.mdvkol.narod.ru/KolVerInfo.zip.Когда-то конвертил в KOL из RX.


Sormy   (2004-06-28 00:34:00) [7]

Обе равны нулю...
Файл существует...
В Файл зашита версия...
Может глючить из-за KOL'a или из-за замены системных библиотек???


YuRock   (2004-06-27 18:41:00) [8]

100%. Я проверял.

Если не работает - значит 1 или 2 причины:
1. Нет файла;
2. В файл не зашита версия.

Протрассируй - посмотри, какой получается длина Len и ResLen - они не должны быть равными 0.


Sormy   (2004-06-27 18:19:00) [9]

А этот вариант 100% рабочий? Он у меня тоже не работает... Может я что-то недопонимаю?


YuRock   (2004-06-27 15:27:00) [10]

Да, извини, я лажанулся - надо параметр (у меня он - 041904E3) вначале узнать, а я из своей проги взял :))

Ну ладно, вот еще один (общий для всех) вариант:

function GetVersionData(FileName: String; var Version, FileVersion: String): Boolean;
var
vi: Pointer;
Len, ResLen: Cardinal;
ffi: PVSFixedFileInfo;
begin
 // Возвращает версию программы в виде "9.9.9.9" (тип String) в Version
 // Возвращает версию файла программы в виде "9.9.9.9" (тип String) в FileVersion
 Result := False;
 Len := GetFileVersionInfoSize(PChar(FileName), ResLen);
 if Len <> 0 then begin
   vi := AllocMem(Len);
   try
     GetFileVersionInfo(PChar(FileName), 0, Len, vi);

     if VerQueryValue(vi, '\\', Pointer(ffi), ResLen) and (ResLen <> 0) then begin
       Version := Format('%d.%d.%d.%d', [HiWord(ffi^.dwProductVersionMS), LoWord(ffi^.dwProductVersionMS), HiWord(ffi^.dwProductVersionLS), LoWord(ffi^.dwProductVersionLS)]);
       FileVersion := Format('%d.%d.%d.%d', [HiWord(ffi^.dwFileVersionMS), LoWord(ffi^.dwFileVersionMS), HiWord(ffi^.dwFileVersionLS), LoWord(ffi^.dwFileVersionLS)]);
     end;

     Result := True;
   finally
     FreeMem(vi);
   end;
 end;
end;


Sormy   (2004-06-27 00:11:00) [11]

Собственно, полное имя экзншника и передаю... из TKolOpenSaveDialog...
Если в проводнике винды версия файла отображается, то можно судить о присутствии структуры VERSIONINFO? Или же версия может где-нить еще прописана???


YuRock   (2004-06-26 21:00:00) [12]

А что ты в FileName передаешь?
А есть ли вообще в этом файле структура VERSIONINFO?


Sormy   (2004-06-26 20:51:00) [13]

Странно, но не работает :-(
Всегда в ЛОЖЬ функция срабатывает...


Sormy   (2004-06-26 20:34:00) [14]

Огромное спасибо, сейчас проверю... :-)


YuRock   (2004-06-26 15:13:00) [15]

Если Вы имеете в виду по "версией файла" - версию бинарника, то вот, например:

function GetVersionData(FileName: String; var ProductName, Version, FileVersion: String): Boolean;
var
 pRes: Pointer;
 Len, ResLen: Cardinal;
 vi: Pointer;
begin
 // Возвращает название программы (тип String) в ProductName
 // Возвращает версию программы в виде "9.9" (тип String) в Version
 // Возвращает версию файла программы в виде "9.9.9.9" (тип String) в FileVersion
 Result := False;
 Len := GetFileVersionInfoSize(PChar(FileName), ResLen);
 if Len <> 0 then begin
   vi := AllocMem(Len);
   try
     GetFileVersionInfo(PChar(FileName), 0, Len, vi);

     if VerQueryValue(vi, '\\StringFileInfo\\041904E3\\ProductName', pRes, ResLen) then ProductName := String(PChar(pRes));
     if VerQueryValue(vi, '\\StringFileInfo\\041904E3\\ProductVersion', pRes, ResLen) then Version := String(PChar(pRes));
     if VerQueryValue(vi, '\\StringFileInfo\\041904E3\\FileVersion', pRes, ResLen) then FileVersion := String(PChar(pRes));

     Result := True;
   finally
     FreeMem(vi);
   end;
 end;
end;


Sormy   (2004-06-26 14:54:00) [16]

А как средствами Дельфи или WinAPI это реализовать?


SPeller   (2004-06-26 14:37:00) [17]

Под KOL ничего особого нет.


Наверх

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