【问题标题】:Compiled VS_VERSION_INFO resource displays in Explorer unexpected texts已编译的 VS_VERSION_INFO 资源在资源管理器中显示意外文本
【发布时间】:2021-10-07 17:30:50
【问题描述】:

我正在使用外部文件 (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


    【解决方案1】:

    根据the documentation's exampleVALUE 的所有数据部分都必须有一个终止 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 必须是使用,因为否则没有人知道文本在哪里结束:

    【讨论】:

    • 再次感谢您!
    【解决方案2】:

    尝试使用空终止符 \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
    

    【讨论】:

    • 再次感谢雷米!
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多