2012-10-22 86 views
1

我正在通過LoadPackage()在運行時加載軟件包。比方說,我想檢查包的版本,以確保它是最新的。我怎樣才能做到這一點?如何在運行時獲取軟件包名稱/版本

+2

U可以考慮單元的版本:http://stackoverflow.com/questions/5251165 –

回答

7

軟件包只是一種特殊類型的dll,因此您可以使用SysUtils單元中定義的GetFileVersion函數,該函數返回版本號的最高有效32位。因此不包括髮布和/或內部版本號。

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils; 

Var 
    FileVersion : Cardinal; 
begin 
    try 
    FileVersion:=GetFileVersion('C:\Bar\Foo.bpl'); 
    Writeln(Format('%d.%d',[FileVersion shr 16, FileVersion and $FFFF])); 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

如果你想獲取完整版本號(與釋放和建立數字包括在內),你可以使用GetFileVersionInfoSizeVerQueryValueGetFileVersionInfo WINAPI功能。

function GetFileVersionStr(const AFileName: string): string; 
var 
    FileName: string; 
    LinfoSize: DWORD; 
    lpdwHandle: DWORD; 
    lpData: Pointer; 
    lplpBuffer: PVSFixedFileInfo; 
    puLen: DWORD; 
begin 
    Result := ''; 
    FileName := AFileName; 
    UniqueString(FileName); 
    LinfoSize := GetFileVersionInfoSize(PChar(FileName), lpdwHandle); 
    if LinfoSize <> 0 then 
    begin 
    GetMem(lpData, LinfoSize); 
    try 
     if GetFileVersionInfo(PChar(FileName), lpdwHandle, LinfoSize, lpData) then 
     if VerQueryValue(lpData, '\', Pointer(lplpBuffer), puLen) then 
      Result := Format('%d.%d.%d.%d', [ 
      HiWord(lplpBuffer.dwFileVersionMS), 
      LoWord(lplpBuffer.dwFileVersionMS), 
      HiWord(lplpBuffer.dwFileVersionLS), 
      LoWord(lplpBuffer.dwFileVersionLS)]); 
    finally 
     FreeMem(lpData); 
    end; 
    end; 

end; 
+0

感謝澄清如何:-) – JustMe

+5

翻譯文件版本更可讀的形式由於文件在內存中已經加載,它是實際上,使用'TResourceStream'直接訪問'RT_RESOURCE'資源更加高效和準確,而不是使用'GetFileVersionInfo()',至少就版本號而言,因爲它是靜態數據。 –

+0

@RemyLebeau你能指點我的文檔嗎?我找不到它。 – JustMe

相關問題