2011-07-02 3 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; 

: 파일의 버전의 수신에 대한

나는 함수를 사용합니다. 그러나 일부 파일에서는 버전이 잘리지 않고 빌드없이 표시됩니다. 예 : BASS.DLL 파일 (http://us.un4seen.com/files/bass24.zip) 파일의 속성에서 Windows 탐색기에 버전 2.4.7.1이 표시되고 function 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 버전을 사용하면 해킹이 많이 발생하지 않고 원하는 방식으로 절대 버전을 얻을 수 있습니다.

관련 문제