Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1309155531
brother
2011-06-27 10:18
2011.10.23
Служюы в WinXP


15-1309267786
eXAAAXe
2011-06-28 17:29
2011.10.23
Что за функция OpenRaw?


15-1308944137
engine
2011-06-24 23:35
2011.10.23
Перевод проекта с Delphi на FreePascal


2-1309850310
Scott Storch
2011-07-05 11:18
2011.10.23
array of char to string and back


2-1309625895
StuDD
2011-07-02 20:58
2011.10.23
Как проверить соединение с Интернетом через прокси (wininet)