delphi - GetFileVersionInfoSize 和 GetFileVersionInfo 不返回任何内容

标签 delphi delphi-2007

GetFileVersionInfoSize 为 0(零) 并且 GetFileVersionInfo 不返回任何内容

我像这样使用它:

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;

基于堆栈回复Get FileVersion with Build

它在大多数情况下都有效。

谢谢

最佳答案

您没有检查 GetFileVersionInfoSize 的返回值。如果文件名无效或没有可用的版本信息,它将返回零(错误),并且文档说您可以找出使用 GetLastError 的原因。 。当您使用 Delphi 2007 时,跨平台兼容性不是问题(至少目前如此),您可以使用 SysErrorMessage(GetLastError) 获取失败原因的字符串描述。

我编写它是为了在出现问题时返回错误消息;当然,在实际应用程序中,您可能不想这样做。

这有效(在 Delphi 7、Win7 64 位上测试):

function FileVersion(const FileName: TFileName): String;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
  iLastError: DWord;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  if VerInfoSize > 0 then
  begin
    GetMem(PVerInfo, VerInfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
      begin
        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
      end
      else
      begin
        iLastError := GetLastError;
        Result := Format('GetFileVersionInfo failed: (%d) %s', 
                      [iLastError, SysErrorMessage(iLastError)]);
      end;
    finally
      FreeMem(PVerInfo, VerInfoSize);
    end;
  end
  else
  begin
    iLastError := GetLastError;
    Result := Format('GetFileVersionInfo failed: (%d) %s', 
                     [iLastError, SysErrorMessage(iLastError)]);
  end;
end;

始终测试 WinAPI 调用的返回值。 MSDN 上的文档描述了返回值和失败原因(或者告诉您可以从 GetLastError 获取)。

关于delphi - GetFileVersionInfoSize 和 GetFileVersionInfo 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279394/

相关文章:

multithreading - 竞争条件 - 互斥体可以更灵活吗?

delphi - 如何在运行时从 ttabcontrol 中删除 ttabitem -- FireMonkey

delphi - 有没有办法编辑默认build设置?

delphi - 需要 Delphi 和 ADOTable 过滤方面的帮助

delphi - 在装有 Delphi 2007 的机器上安装 D5(和第三方组件)?

excel - 应用程序结束后保持 Excel 打开(Delphi 自动化)

Delphi MSBuild 从命令行构建配置

arrays - 如何找到数组中最小和最大的数字?

delphi - 为什么我需要指定 Canvas 的字体来更改 Delphi 2009 中的字体大小?

java - 如何从此 JAVA 文件中提取 Delphi 类以用于 Android?