![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как извлечь версию файла из произвольного файла? [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 ничего особого нет.