![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Версии exe и dll
Gu © (2011-07-02 18:15:00)Может кто-нить дать рабочий код определения версии файлов под дельфи 2010 и старше?
Есть рабочий пример в компоненте TMS ExeInfo, вот основная процедура:
procedure TExeInfo.GetVersionInfoOfApp(const AAppName: string);
type
PTransBuffer = ^TTransBuffer;
TTransBuffer = array[1..4] of smallint;
var
iAppSize, iLenOfValue : DWord;
pcBuf,pcValue : PChar;
VerSize : DWord;
pTrans : PTransBuffer;
TransStr : string;
sAppName : String;
fvip : pointer;
ft : TFileTime;
st : TSystemTime;
begin
sAppName := AAppName;
// get version information values
iAppSize:= GetFileVersionInfoSize(PChar(sAppName),// pointer to filename string
iAppSize); // pointer to variable to receive zero
// if GetFileVersionInfoSize is successful
if iAppSize > 0 then
begin
pcBuf := AllocMem(iAppSize);
GetFileVersionInfo(PChar(sAppName), // pointer to filename string
0, // ignored
iAppSize, // size of buffer
pcBuf); // pointer to buffer to receive file-version info.
VerQueryValue(pcBuf, '\', fvip, iLenOfValue);
FFileFlags := TVSFixedFileInfo(fvip^).dwFileFlags and TVSFixedFileInfo (fvip^).dwFileFlagsMask;
FFileOS := TVSFixedFileInfo(fvip^).dwFileOS;
FFileType := TVSFixedFileInfo(fvip^).dwFileType;
ft.dwLowDateTime := TVSFixedFileInfo(fvip^).dwFileDateLS;
ft.dwHighDateTime := TVSFixedFileInfo(fvip^).dwFileDateMS;
if (ft.dwLowDateTime <> 0) or (ft.dwHighDateTime <> 0) then
begin
FileTimeToSystemTime(ft,st);
FFileCreation := SystemTimeToDateTime(st);
end
else
begin
FFileCreation := FileDateToDateTime(FileAge(Application.ExeName));
end;
VerQueryValue(pcBuf, PChar('\VarFileInfo\Translation'),
pointer(ptrans), verSize);
TransStr:= IntToHex(ptrans^[1], 4) + IntToHex(ptrans^[2], 4);
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'CompanyName'), Pointer(pcValue),iLenOfValue) then
FCompanyName := pcValue
Else FCompanyName := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'FileDescription'), Pointer(pcValue),iLenOfValue) then
FFileDescription := pcValue
Else FFileDescription := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'FileVersion'), Pointer(pcValue),iLenOfValue) then
FFileVersion := pcValue
Else FFileVersion := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'InternalName'), Pointer(pcValue),iLenOfValue) then
FInternalName := pcValue
Else FInternalName := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'LegalCopyright'), Pointer(pcValue),iLenOfValue) then
FLegalCopyright := pcValue
Else FLegalCopyright := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'LegalTradeMarks'), Pointer(pcValue),iLenOfValue) then
FLegalTradeMark := pcValue
Else FLegalTradeMark := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'OriginalFileName'), Pointer(pcValue),iLenOfValue) then
FOriginalFileName := pcValue
Else FOriginalFileName := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'ProductName'), Pointer(pcValue),iLenOfValue) then
FProductName := pcValue
Else FProductName := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'ProductVersion'), Pointer(pcValue),iLenOfValue) then
FProductVersion := pcValue
Else FProductVersion := '';
if VerQueryValue(pcBuf,PChar('StringFileInfo\' + TransStr + '\' +
'Comments'), Pointer(pcValue),iLenOfValue) then
FComments := pcValue
Else FComments := '';
FreeMem(pcBuf,iAppSize);
end;
end;
Она норм работает, но для некоторых файлов обрезает Build, т.е винда показывает например 2.4.7.1 а процедура возвращает 2.4.7
Может как то тут что-то изменить (версия файла запрашивается в месте где строка "FileVersion"), чтобы не обрезалось? И почему только некоторые файлы?
Palladin (2011-07-03 16:53:00) [1]))
Германн (2011-07-03 01:24:00) [2]
> это типа "найди 10 отличий"?
Это типа, что в [6] код отформатирован гораздо лучше! Ровненький такой прямоугольничек.
Gu (2011-07-03 01:13:00) [3]это типа "найди 10 отличий"?
В школу! (2011-07-03 00:06:00) [4]Неправильно подсказали, надо так:
function FileVersion(const FileName: TFileName): String; var VerInfoSize:
Cardinal; VerValueSize: Cardinal; Dummy: Cardinal; PVerInfo: Pointer;
PVerValue: PVSFixedFileInfo ; begin Result := '' ; VerInfoSize :=
GetFileVersionInfoSize( PChar ( FileName) , Dummy); GetMem( PVerInfo,
VerInfoSize); try if GetFileVersionInfo(PChar(FileName),0,VerInfoSize,
PVerInfo ) then if VerQueryValue(PVerInfo, '\', Pointer(PVerValue),
VerValueSize) then with PVerValue^ do Result:=Format('v%d.%d.%d build %d',
[ HiWord(dwFileVersionMS ), {Major} LoWord (dwFileVersionMS), {Minor}
HiWord(dwFileVersionLS), {Release} LoWord (dwFileVersionLS )]); {Build}
finally FreeMem(PVerInfo,VerInfoSize);end;end;
Gu (2011-07-02 20:35:00) [5]во, подсказали:
function FileVersion(const FileName: TFileName): String;
var VerInfoSize: Cardinal; VerValueSize: Cardinal; Dummy: Cardinal; PVerInfo: Pointer; PVerValue: PVSFixedFileInfo;
begin Result := ''; VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy); GetMem(PVerInfo, VerInfoSize);
try if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
with PVerValue^ do
Result := Format('v%d.%d.%d build %d', [HiWord(dwFileVersionMS), //Major
LoWord(dwFileVersionMS), //Minor
HiWord(dwFileVersionLS), //Release
LoWord(dwFileVersionLS)]); //Build
finally FreeMem(PVerInfo, VerInfoSize); end;
end;
Gu (2011-07-02 20:30:00) [6]bass для примера, есть еще куча exe и dll которые так build скрывают
antonn (work) (2011-07-02 19:30:00) [7]если нужно именно bass проверить, то в нем вроде есть функция которая возвращает версию библиотеки
Gu (2011-07-02 18:35:00) [8]ага, понял почему обрезает, открыл файлик через reshacker, там в ресурсе versioninfo смотрю:
1 VERSIONINFO
FILEVERSION 2,4,7,1
PRODUCTVERSION 2,4,0,0
FILEOS 0x4
FILETYPE 0x2
{
BLOCK "StringFileInfo"
{
BLOCK "000004b0"
{
VALUE "CompanyName", "Un4seen Developments"
VALUE "FileDescription", "BASS"
VALUE "FileVersion", "2.4.7"
VALUE "LegalCopyright", "Copyright © 1999-2010"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0000 0x04B0
}
}
Вопрос: как получить "FILEVERSION 2,4,7,1" а не VALUE "FileVersion", "2.4.7"
Винда же показывает полную версию (2.4.7.1 - пр.кл.на файле в проводнике, свойства, закладка подробно)?
Gu (2011-07-02 18:29:00) [9]или вот: http://www.delphisources.ru/pages/faq/base/get_app_version.html