如何在运行时获取包名称/版本

Jus*_*tMe 2 delphi delphi-xe2

我正在运行时加载包LoadPackage().让我们说加载后我想检查包的版本,以确保它是最新的.我怎样才能做到这一点?

RRU*_*RUZ 7

包只是一种特殊类型的dll,因此您可以使用GetFileVersionSysUtils单元中定义的函数,此函数返回版本号的最重要的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.
Run Code Online (Sandbox Code Playgroud)

如果你想获取完整版本号(与发行,并建立包括数字),您可以使用GetFileVersionInfoSize,VerQueryValueGetFileVersionInfoWINAPI功能.

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;
Run Code Online (Sandbox Code Playgroud)

  • 由于文件已经加载到内存中,因此直接访问其`RT_RESOURCE`资源实际上更有效,更准确,例如使用`TResourceStream`,而不是使用`GetFileVersionInfo()`,至少就版本号而言因为它是静态数据而受到关注. (5认同)