2

我正在使用外部文件 ( 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 的详细信息,我注意到一些数据被破坏并且出现了疯狂的符号。怎么了?

资源管理器文件版本详细信息

4

2 回答 2

4

尝试使用 null 终止符来终止您的字符串值\0,例如:

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\0"
        VALUE "CompanyName",      "Company2\0"
        VALUE "FileDescription",  "Company Soft\0"
        VALUE "FileVersion",      "x.x.x.x\0"
        VALUE "InternalName",     "Company Soft\0"
        VALUE "LegalCopyright",   "Company2\0"
        VALUE "OriginalFilename", "abrev.exe\0"
        VALUE "ProductName",      "Company Soft\0"
        VALUE "ProductVersion",   "x.x.x.x\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0409,1200
    END
END
于 2021-10-07T17:51:44.977 回答
4

根据文档的示例, a 的所有数据部分都VALUE必须有一个终止 NULL 字节:

#define VER_FILEVERSION_STR "3.10.349.0\0"
...
VALUE "FileVersion", VER_FILEVERSION_STR

此外,几十年来,我在 Delphi 中工作时习惯于使用大括号,而不是对块使用关键字:

FILETYPE 0x1 {
  BLOCK "StringFileInfo" {
    BLOCK "00000000" {
      VALUE "FileDescription", "Great product, much value!\000" 
      VALUE "FileVersion", "1.0.39\000" 
    }
  }
  BLOCK "VarFileInfo" {
    VALUE "Translation", 0x0000 0x0000
  }
}

毫无疑问,总是在字符串中添加一个终止的 NULL 字节——这通常是预期的。如果您查看已编译的 RES 文件并查看您的文本如何转换为 UTF-16,您还会注意到没有任何文本以任何看起来像长度的东西作为前缀 - 这也是\0必须使用终止符的原因,因为否则没有人知道文本在哪里结束: FILEVERSION 资源的二进制文件

于 2021-10-07T17:53:03.327 回答