无法读取与代码页不匹配的FileVersionInfo

我有一些合理的尝试和testing的代码,它使用Windows API调用读取FileVersionInfostring,如“FileVersion”和“CompanyName”。

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

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

但是调整代码以使用Windows Latin-1 ANSI代码页可以工作: \StringFileInfo\040904E4\CompanyName

因此,string表中的代码页与\VarFileInfo\Translation值不匹配。

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

鉴于此,我可以使用发布的VersionInfo API正确读取此文件的string,而不用“猜测”代码页?

Solutions Collecting From Web of "无法读取与代码页不匹配的FileVersionInfo"

不幸的是,当从资源文件编译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维护分支 。