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

问题描述 投票:0回答: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 详细信息,我注意到一些数据被破坏并且出现了疯狂的符号。发生什么事了?

delphi explorer fileversioninfo
2个回答
6
投票

根据文档的示例

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
必须的原因被使用,因为否则没有人知道文本在哪里结束:


5
投票

尝试用空终止符来终止字符串值

\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
© www.soinside.com 2019 - 2024. All rights reserved.