Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

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

 
b/@. ©   (2009-06-12 12:48) [0]

Нашел несколько примеров, только все они противоречивые:
вот первый
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

Так а как всётаки правильно ?


 
palva ©   (2009-06-12 18:06) [1]

У файла не бывает версии. Если он лежит в NTFS, то можно вытащить дату его создания. Может быть, это поможет.


 
Игорь Шевченко ©   (2009-06-13 00:39) [2]


> Так а как всётаки правильно ?


http://www.delphisources.ru/pages/faq/base/file_version.html

по крайней мере за 10 лет этот метод не подводил

В остальные не смотрел, бо наворочено


 
Германн ©   (2009-06-13 00:44) [3]


> Игорь Шевченко ©   (13.06.09 00:39) [2]
>
>
> > Так а как всётаки правильно ?
>
>
> http://www.delphisources.ru/pages/faq/base/file_version.
> html
>

И это способ определения версии любого файла?
:)


 
Игорь Шевченко ©   (2009-06-13 01:48) [4]

Германн ©   (13.06.09 00:44) [3]


> И это способ определения версии любого файла?
> :)


Безусловно любого, абы он соответствовал формату PE и имел ресурс типа RT_VERSION


 
Германн ©   (2009-06-13 02:30) [5]


> Безусловно любого, абы он соответствовал формату PE и имел
> ресурс типа RT_VERSION
>

Ну да, ну да.


 
Нат ©   (2009-06-13 03:36) [6]

Для начала, зачем автору номер версии?
Красиво нарисовать на заставке?
Тогда это не поможет.
Прежде чем читать, номер версии придется записать.


 
b/@. ©   (2009-06-15 10:49) [7]

Да-да-да :)
Автору номер версии нужен именно для того, чтобы красиво нарисовать на заставке.
А еще из-за того, что эта форма общая для нескольких программ и соответсвенно имя программы и версия у них разное.


> Игорь Шевченко ©   (13.06.09 00:39) [2]

В SysUtils неожиданно нашлась фунция GetFileVersion :)


 
oldman ©   (2009-06-15 11:00) [8]


> b/@. ©   (15.06.09 10:49) [7]
> В SysUtils неожиданно нашлась фунция GetFileVersion :)


Поищи еще SetFileVersion :)


 
Игорь Шевченко ©   (2009-06-15 12:43) [9]

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


 
b/@. ©   (2009-06-15 15:14) [10]


> Игорь Шевченко ©   (15.06.09 12:43) [9]
> то видно, что в первом случае берется только FixedInfo.dwFileVersionMS, а во втором еще и FixedInfo.dwFileVersionLS

Думаю это уже мелочи :)
Меня больше интересовали аргументы VerQueryValue(VerBuf, "\", Pointer(FI), VerSize)

Есть еще один вопрос, но спрошу уже в новой теме.


 
b/@. ©   (2009-06-16 12:33) [11]

Вот какая странная получилась собственная версия :)

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;


 
Игорь Шевченко ©   (2009-06-16 12:40) [12]

b/@. ©   (16.06.09 12:33) [11]

в
> http://www.delphisources.ru/pages/faq/base/file_version.
> html


короче



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

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
15-1245353234
DesWind
2009-06-18 23:27
2009.08.16
Это реклама!!!


2-1245318231
Vitaliy_____
2009-06-18 13:43
2009.08.16
Правильное оформление деструктора


15-1245399047
василий иванович
2009-06-19 12:10
2009.08.16
asp.net и взаимодействие страниц


1-1211958221
Still Swamp
2008-05-28 11:03
2009.08.16
Dsgjkyb


15-1245011026
DillerXX
2009-06-15 00:23
2009.08.16
Лексикографическая сортировка?!