【问题标题】:How does Windows interpret multiple VersionInfo Resources?Windows 如何解释多个 VersionInfo 资源?
【发布时间】:2026-01-21 02:50:02
【问题描述】:

我目前正在研究 Windows 的 VersionInfo 资源。 在 VS_VERSION_INFO 资源中可以有多个 VS_VERSIONINFO/VS_FIXEDFILEINFO 结构,这有点令人困惑。

据我所知,您可以拥有多个具有不同语言 ID 的 RT_VERSION->VS_VERSION_INFO 资源。 (如图所示)

这 2 个语言 ID (0 and 1031) 实际上每个都有 2 个不同的 VS_VERSIONINFO/VS_FIXEDFILEINFO

0 是一种中性语言,似乎比您的实际本地语言 ID(1031)优先。

对我来说,这似乎有点混乱和令人困惑。 VS_VERSION_INFO 资源中怎么可能有多个 VS_VERSIONINFO 结构,这有什么意义? Windows如何解释多个资源、结构? 又怎么可能在调用GetFileVersionInfo的时候只得到一块缓冲区呢?

这对我来说毫无意义,我找不到太多关于它的文档。

【问题讨论】:

    标签: windows winapi version versioning embedded-resource


    【解决方案1】:
    1. 您必须区分文本信息和裸露的 VS_FIXEDFILEINFO 块。第一个块只存在一次。文本信息取决于语言。
    2. “Windows”不喜欢特定的;)资源管理器所做的是另一回事。它只显示资源信息。但实际上这只是字符串信息,并不是固定版本信息中的信息。
    3. 当您调用 GetFileVersionInfo 时,您将获得所有语言块! VerQueryValue 用于访问单独的块。
    4. Windows 中的安装程序和其他例程仅使用 VS_FIXEDFILEINFO 块。他们不关心任何文本块。而且这个块只存在一次。

    我假设资源管理器只显示第一个文本块,也不喜欢特定的文本块。只需使用文本编辑器并交换资源文件中的块。但也许资源编译器会重新排序它们。

    要访问单独的部分: - 带有“\”的 VerQueryValue 为您提供固定版本信息块 VS_FIXEDFILEINFO - 带有“\VarFileInfo\Translation”的 VerQueryValue 为您提供翻译列表 - 使用“\StringFileInfo\langId_charset\keyname”,您可以获得特定的字符串部分

    您可以在MSDN 中找到此信息

    【讨论】:

    • msdn.microsoft.com/en-us/library/windows/desktop/… 指出这种结构可以出现不止一次。关键字是[..] current version structure.[..] 或者真的只有一个VS_VERSIONINFO
    • 我不明白你的评论。你只有一个 VS_VERSION_INFO VERSIONINFO。而且里面只有一个VS_FIXEDFILEINFO。
    • 好的。但后来我不明白为什么 MSDN 使用关键字“当前版本结构”,在我看来可能不止一个