我有一些合理尝试和测试的代码,它们使用Windows API调用来读取FileVersionInfo字符串,比如"FileVersion“和"CompanyName”。
我发现它与一个特定的第三方DLL失败。问题似乎是这样的:
读取unicode值,我得到040904B0 (美国英语,\VarFileInfo\Translation )。但是,当我随后尝试在\StringFileInfo\040904B0\CompanyName上调用VerQueryValue时,它返回false。
但是,调整代码以使用Windows拉丁语-1ANSI代码页是可行的:\StringFileInfo\040904E4\CompanyName。
因此,字符串表中的代码页与\VarFileInfo\Translation值不匹配。
根据MSDN的VERSIONINFO resource文档底部的示例资源,这是一件合适的事情!
鉴于此,我是否可以使用发布的VersionInfo API正确读取此文件的字符串,而无需“猜测”代码页?
发布于 2016-06-23 08:04:05
不幸的是,当从资源文件编译时,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拉丁语1)。奇怪的是,主可执行文件的信息是正确的,并且信息几乎相同。
Remy Lebeau为这个问题提交了一个bug report,而我已经提交了一个patch。
截至2016年6月24日,修补程序has been accepted和backported to the 2.2 maintenance branch。
https://stackoverflow.com/questions/37953472
复制相似问题