已编译 VS_VERSION_INFO 资源在资源管理器中显示意外文本

Compiled VS_VERSION_INFO resource displays in Explorer unexpected texts

我正在使用外部文件 (verinfo.rc) 生成已编译 EXE 文件的详细信息。这是我的文件的示例:

VS_VERSION_INFO VERSIONINFO
FILEVERSION             1,0,0,0
PRODUCTVERSION          1,0,0,0
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
        VALUE "Comments",         "Company Soft"
        VALUE "CompanyName",      "Company2"
        VALUE "FileDescription",  "Company Soft"
        VALUE "FileVersion",      "x.x.x.x"
        VALUE "InternalName",     "Company Soft"
        VALUE "LegalCopyright",   "Company2"
        VALUE "OriginalFilename", "abrev.exe"
        VALUE "ProductName",      "Company Soft"
        VALUE "ProductVersion",   "x.x.x.x"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0409,1200
    END
END

使用资源管理器查看已编译的 EXE 的详细信息,我注意到一些数据被破坏并且出现了疯狂的符号。发生了什么事?

尝试用空终止符终止您的字符串值 [=11=],例如:

VS_VERSION_INFO VERSIONINFO
FILEVERSION             1,0,0,0
PRODUCTVERSION          1,0,0,0
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
        VALUE "Comments",         "Company Soft[=10=]"
        VALUE "CompanyName",      "Company2[=10=]"
        VALUE "FileDescription",  "Company Soft[=10=]"
        VALUE "FileVersion",      "x.x.x.x[=10=]"
        VALUE "InternalName",     "Company Soft[=10=]"
        VALUE "LegalCopyright",   "Company2[=10=]"
        VALUE "OriginalFilename", "abrev.exe[=10=]"
        VALUE "ProductName",      "Company Soft[=10=]"
        VALUE "ProductVersion",   "x.x.x.x[=10=]"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0409,1200
    END
END

根据 the documentation's exampleVALUE 的所有数据部分必须有一个终止 NULL 字节:

#define VER_FILEVERSION_STR "3.10.349.0[=10=]"
...
VALUE "FileVersion", VER_FILEVERSION_STR

此外,在 Delphi 中工作时,我习惯使用花括号数十年,而不是使用关键字来表示块:

FILETYPE 0x1 {
  BLOCK "StringFileInfo" {
    BLOCK "00000000" {
      VALUE "FileDescription", "Great product, much value![=11=]0" 
      VALUE "FileVersion", "1.0.39[=11=]0" 
    }
  }
  BLOCK "VarFileInfo" {
    VALUE "Translation", 0x0000 0x0000
  }
}

有疑问总是向字符串添加终止 NULL 字节 - 通常情况下是这样。如果您查看已编译的 RES 文件并查看您的文本如何转换为 UTF-16,您还会注意到 none 的文本带有任何看起来像长度的前缀 - 这也是终止 [ =13=] 必须使用,否则没人知道文本在哪里结束: