2011-07-02 50 views
4

DelphiXe。獲取FileVersion與Build

有關的文件的版本接待我使用功能:

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': (

我開過Resourcehacker.exe文件(http://angusj.com/resourcehacker/),我期待結構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 
} 
} 

問題:如何接收2.4.7.1,即滿版本?

回答

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有一個導出,當使用時,你可以得到它的絕對版本,就像你想要的沒有大量的黑客和什麼不是。