首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法读取代码页不匹配的FileVersionInfo

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

Stack Overflow用户
提问于 2016-06-22 03:56:03
回答 1查看 1K关注 0票数 3

我有一些合理尝试和测试的代码,它们使用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正确读取此文件的字符串,而无需“猜测”代码页?

EN

回答 1

Stack Overflow用户

发布于 2016-06-23 08:04:05

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

然而,在您的例子中,您使用的是VLC库,这些库当前定义了它们的版本信息,如下所示:(修剪后不会占用半个页面)

代码语言:javascript
复制
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 acceptedbackported to the 2.2 maintenance branch

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37953472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档