![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно определять версию файла ? [D7, XP]
b/@. © (2009-06-12 12:48:00)Нашел несколько примеров, только все они противоречивые:
вот первый
http://kladovka.net.ru/delphibase/?action=viewfunc&topic=fileattr&id=10389
еще один
http://kladovka.net.ru/delphibase/?action=viewfunc&topic=fileattr&id=10055
самый короткий
http://www.delphisources.ru/pages/faq/base/file_version.html
Так а как всётаки правильно ?
Игорь Шевченко (2009-06-16 12:40:00) [1]b/@. © (16.06.09 12:33) [11]
в
> http://www.delphisources.ru/pages/faq/base/file_version.
> html
короче
b/@. (2009-06-16 12:33:00) [2]Вот какая странная получилась собственная версия :)
function GetVersion(const AFileName: string; out AVersion: string): boolean;
resourcestring
SEmpty = 'filename is empty';
SExist = 'file not exist';
SSize = 'version info not included ';
SAlloc = 'memory allocation error';
SInfo = 'getting version info fail';
SValue = 'query value failed';
SLen0 = 'query value length = 0';
SSigna = 'wrong version info signature';
const
SVersion = '%d.%d.%d.%d';
type
LPVOID = pointer;
var
Filename: string;
lptstrFilename: LPTSTR;
dwHandle: DWORD;
dwLen: DWORD;
lpData: LPVOID;
pFileInfo: ^VS_FIXEDFILEINFO;
puLen: UINT;
major: WORD;
minor: WORD;
relea: WORD;
build: WORD;
begin
result := false;
if Length(AFileName) = 0
then begin
AVersion := SEmpty;
exit;
end;
if not FileExists(AFileName)
then begin
AVersion := SExist;
exit;
end;
Filename := AFileName;
UniqueString(Filename);
lptstrFilename := LPTSTR(Filename);
dwLen := GetFileVersionInfoSize(lptstrFilename, dwHandle);
if dwLen = 0
then begin
AVersion := SSize;
exit;
end;
try
lpData := AllocMem(dwLen);
except
AVersion := SAlloc;
exit;
end;
try
if not GetFileVersionInfo(lptstrFilename, dwHandle, dwLen, lpData)
then begin
AVersion := SInfo;
exit;
end;
if not VerQueryValue(lpData, '\', LPVOID(pFileInfo), puLen)
then begin
AVersion := SValue;
exit;
end;
if puLen <= 0
then begin
AVersion := SLen0;
exit;
end;
if pFileInfo.dwSignature = VS_FFI_SIGNATURE
then begin
major := pFileInfo.dwFileVersionMS shr 16;
minor := pFileInfo.dwFileVersionMS and $FFFF;
relea := pFileInfo.dwFileVersionLS shr 16;
build := pFileInfo.dwFileVersionLS and $FFFF;
AVersion := Format(SVersion, [major, minor, relea, build]);
result := true;
end else begin
AVersion := SSigna;
exit;
end;
finally
FreeMem(lpData);
end;
end;
b/@. (2009-06-15 15:14:00) [3]
> Игорь Шевченко © (15.06.09 12:43) [9]
> то видно, что в первом случае берется только FixedInfo.dwFileVersionMS, а во втором еще и FixedInfo.dwFileVersionLS
Думаю это уже мелочи :)
Меня больше интересовали аргументыVerQueryValue(VerBuf, '\', Pointer(FI), VerSize)
Есть еще один вопрос, но спрошу уже в новой теме.
Игорь Шевченко (2009-06-15 12:43:00) [4]b/@. © (15.06.09 10:49) [7]
> В SysUtils неожиданно нашлась фунция GetFileVersion :)
Мне, например, такая реализация не годится -
"It generally does not include the release or build numbers."
если посмотреть ее код и код в
> http://www.delphisources.ru/pages/faq/base/file_version.html
то видно, что в первом случае берется только FixedInfo.dwFileVersionMS, а во втором еще и FixedInfo.dwFileVersionLS
oldman (2009-06-15 11:00:00) [5]
> b/@. © (15.06.09 10:49) [7]
> В SysUtils неожиданно нашлась фунция GetFileVersion :)
Поищи ещеSetFileVersion:)
b/@. (2009-06-15 10:49:00) [6]Да-да-да :)
Автору номер версии нужен именно для того, чтобы красиво нарисовать на заставке.
А еще из-за того, что эта форма общая для нескольких программ и соответсвенно имя программы и версия у них разное.
> Игорь Шевченко © (13.06.09 00:39) [2]
ВSysUtilsнеожиданнонашлась фунцияGetFileVersion:)
Нат (2009-06-13 03:36:00) [7]Для начала, зачем автору номер версии?
Красиво нарисовать на заставке?
Тогда это не поможет.
Прежде чем читать, номер версии придется записать.
Германн (2009-06-13 02:30:00) [8]
> Безусловно любого, абы он соответствовал формату PE и имел
> ресурс типа RT_VERSION
>
Ну да, ну да.
Игорь Шевченко (2009-06-13 01:48:00) [9]Германн © (13.06.09 00:44) [3]
> И это способ определения версии любого файла?
> :)
Безусловно любого, абы он соответствовал формату PE и имел ресурс типа RT_VERSION
Германн (2009-06-13 00:44:00) [10]
> Игорь Шевченко © (13.06.09 00:39) [2]
>
>
> > Так а как всётаки правильно ?
>
>
> http://www.delphisources.ru/pages/faq/base/file_version.
> html
>
И это способ определения версии любогофайла?
:)
Игорь Шевченко (2009-06-13 00:39:00) [11]
> Так а как всётаки правильно ?
http://www.delphisources.ru/pages/faq/base/file_version.html
по крайней мере за 10 лет этот метод не подводил
В остальные не смотрел, бо наворочено
palva (2009-06-12 18:06:00) [12]У файла не бывает версии. Если он лежит в NTFS, то можно вытащить дату его создания. Может быть, это поможет.