Текущий архив: 2011.10.23;
Скачать: CL | DM;
Вниз
Версии exe и dll Найти похожие ветки
← →
Gu (2011-07-02 18:15) [0]Может кто-нить дать рабочий код определения версии файлов под дельфи 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"), чтобы не обрезалось? И почему только некоторые файлы?
← →
Gu (2011-07-02 18:29) [1]или вот: http://www.delphisources.ru/pages/faq/base/get_app_version.html
← →
Gu (2011-07-02 18:35) [2]ага, понял почему обрезает, открыл файлик через 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 - пр.кл.на файле в проводнике, свойства, закладка подробно)?
← →
antonn (work) (2011-07-02 19:30) [3]если нужно именно bass проверить, то в нем вроде есть функция которая возвращает версию библиотеки
← →
Gu (2011-07-02 20:30) [4]bass для примера, есть еще куча exe и dll которые так build скрывают
← →
Gu (2011-07-02 20:35) [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;
← →
В школу! (2011-07-03 00:06) [6]Неправильно подсказали, надо так:
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-03 01:13) [7]это типа "найди 10 отличий"?
← →
Германн © (2011-07-03 01:24) [8]
> это типа "найди 10 отличий"?
Это типа, что в [6] код отформатирован гораздо лучше! Ровненький такой прямоугольничек.
← →
Palladin © (2011-07-03 16:53) [9]))
Страницы: 1 вся ветка
Текущий архив: 2011.10.23;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.007 c