2011-07-02 13 views
4

DelphiXe。それが正しい値を返す実行ファイルとライブラリの大半をビルドでFileVersionを取得

function FileVersion(AFileName: string): string; 
var 
    szName: array[0..255] of Char; 
    P: Pointer; 
    Value: Pointer; 
    Len: UINT; 
    GetTranslationString: string; 
    FFileName: PChar; 
    FValid: boolean; 
    FSize: DWORD; 
    FHandle: DWORD; 
    FBuffer: PChar; 
begin 
    try 
    FFileName := StrPCopy(StrAlloc(Length(AFileName) + 1), AFileName); 
    FValid := False; 
    FSize := GetFileVersionInfoSize(FFileName, FHandle); 
    if FSize > 0 then 
    try 
     GetMem(FBuffer, FSize); 
     FValid := GetFileVersionInfo(FFileName, FHandle, FSize, FBuffer); 
    except 
     FValid := False; 
     raise; 
    end; 
    Result := ''; 
    if FValid then 
     VerQueryValue(FBuffer, '\VarFileInfo\Translation', p, Len) 
    else 
     p := nil; 
    if P <> nil then 
     GetTranslationString := IntToHex(MakeLong(HiWord(Longint(P^)), 
     LoWord(Longint(P^))), 8); 
    if FValid then 
    begin 
     StrPCopy(szName, '\StringFileInfo\' + GetTranslationString + 
     '\FileVersion'); 
     if VerQueryValue(FBuffer, szName, Value, Len) then 
     Result := StrPas(PChar(Value)); 
    end; 
    finally 
    try 
     if FBuffer <> nil then 
     FreeMem(FBuffer, FSize); 
    except 
    end; 
    try 
     StrDispose(FFileName); 
    except 
    end; 
    end; 
end; 

:私は関数を使用するファイルのバージョンの受信のための

。しかし、いくつかのファイルでは、バージョンはカットされ、Buildなしで表示されます。 ファイルBASS.DLL(http://us.un4seen.com/files/bass24.zip) ファイルのプロパティのWindowsエクスプローラで、バージョン2.4.7.1を表示し、関数result = '2.4.7'を表示します。

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 
} 
} 

質問:どのように2.4.7.1を受信するために、フルすなわち(

は私がResourcehacker.exeてファイルを開く(http://angusj.com/resourcehacker/)、私は構造のVersionInfo見ますバージョン?

答えて

10

ルートブロックのファイルバージョンが必要な場合は、言語固有の翻訳について忘れてください。

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; 
0

あなたはBASSオーディオライブラリを編集したい場合(あなたはできません)。その理由は、Ianが望む「Petite v1.4」で圧縮されているため、人々は簡単に編集できないからです。

また、バージョンを入手するために、bass.dllを使用すると、ハッキングのないたくさんのものを必要とせずに絶対バージョンを取得できるエクスポートがあります。

関連する問題