3

我有一些经过合理尝试和测试的代码,它们使用 Windows API 调用来读取 FileVersionInfo 字符串,例如“FileVersion”和“CompanyName”。

我发现它因一个特定的第 3 方 DLL 而失败。问题似乎是这样的:

读取\VarFileInfo\Translation值,我得到040904B0(美国英语,Unicode)。但是当我尝试调用VerQueryValueon 时\StringFileInfo\040904B0\CompanyName,它返回 false。

但是调整代码以使用 Windows Latin-1 ANSI 代码页有效:\StringFileInfo\040904E4\CompanyName.

因此,字符串表中的代码页与该值不匹配\VarFileInfo\Translation

根据 MSDN 的VERSIONINFO 资源文档底部的示例资源,这是一个合适的做法!

鉴于此,我可以使用已发布的 VersionInfo API 来正确读取此文件的字符串,而无需“猜测”代码页吗?

4

1 回答 1

3

不幸的是VERSIONINFO,当从资源文件编译时,该结构允许您定义字符串块中不存在的语言,以及语言表中没有条目的字符串块。换句话说,结构没有经过完整性检查。正如Jonathan Potter在评论中提到的那样,使用任意库时最好的选择是使用启发式搜索最适合您的应用程序的字符串块。

但是,在您的情况下,您正在使用 VLC 库,这些库当前定义其版本信息如下:(已修剪,因此不需要半页)

BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    BEGIN
      (...)
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x409, 1200
  END
END

如您所见,翻译块中的语言是 en-us CP1200 (UTF-16LE),但字符串块被标记为 en-us CP1252 (ANSI Latin 1)。奇怪的是,主可执行文件的信息是正确的,而且信息几乎相同。

Remy Lebeau提交了该问题的错误报告,我已经提交了一个补丁

截至 2016 年 6 月 24 日,该补丁已被接受并向后移植到 2.2 维护分支

于 2016-06-23T00:04:05.143 回答