Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

Как извлечь версию файла из произвольного файла?   Найти похожие ветки 

 
Sormy   (2004-06-26 11:32) [0]

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


 
SPeller ©   (2004-06-26 14:37) [1]

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


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

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


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

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

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 20:34) [4]

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


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

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


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

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


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

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


 
YuRock ©   (2004-06-27 15:27) [8]

Да, извини, я лажанулся - надо параметр (у меня он - 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 18:19) [9]

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


 
YuRock ©   (2004-06-27 18:41) [10]

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

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

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


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

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


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

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


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

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


 
Ozone ©   (2004-06-28 12:45) [14]

Sormy   (28.06.04 12:30) [13]

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


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

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

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


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

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

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


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

2 mdw:

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.033 c
1-1090502685
ASoft
2004-07-22 17:24
2004.08.08
Ресурс


9-1082710156
Yar-Com
2004-04-23 12:49
2004.08.08
Библиотека для работы с SSE/SSE2


1-1090499384
segor
2004-07-22 16:29
2004.08.08
как создать форму если ее класс известен только в рантайм?


14-1090439118
Apsi
2004-07-21 23:45
2004.08.08
Базы данных Dbase без BDE!!!


14-1090274838
Piter
2004-07-20 02:07
2004.08.08
Руссификация TTabControl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский