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

标签 delphi delphi-xe2

我在运行时通过LoadPackage()加载包。假设加载后我想检查包的版本以确保它是最新的。我怎样才能做到这一点?

最佳答案

包只是一种特殊类型的dll,所以你可以使用GetFileVersion SysUtils 单元中定义的函数,该函数返回版本号的最高有效 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.

如果您想检索完整的版本号(包括发行版和内部版本号),您可以使用 GetFileVersionInfoSize , VerQueryValueGetFileVersionInfo 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;

关于delphi - 如何在运行时获取包名称/版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018631/

相关文章:

arrays - 当持有数组的引用计数增加时,如何增加子数组的引用计数?

mysql - 使用 Delphi XE2 的 MySQL 的解决方案是什么?

delphi - 如何将 TCanvas 包裹在现有的像素数据周围?

mysql - 如何将存储在 MySQL 表中的位图图像转换为 JPEG 格式?

delphi - firemonkey 表单上的 WS_EX_TRANSPARENT

delphi - 通过包含表单的按钮在运行时删除选项卡

windows - 检测设备(打印机、扫描仪、鼠标等)是否不工作

delphi - 如何在delphi中为azure blob存储生成MD5?

c - 从服务访问 WebDav 资源时拒绝访问

C到delphi转换