gpt4 book ai didi

c++ - 无法读取代码页不匹配的 FileVersionInfo

转载 作者:可可西里 更新时间:2023-11-01 09:28:11 27 4
gpt4 key购买 nike

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

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

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

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

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

根据 MSDN VERSIONINFO resource 底部的示例资源文档,这是正确的做法!

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

最佳答案

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

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

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

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

Remy Lebeau提交了 bug report对于这个问题,我已经提交了 patch .

截至 2016 年 6 月 24 日补丁 has been acceptedbackported to the 2.2 maintenance branch .

关于c++ - 无法读取代码页不匹配的 FileVersionInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com