我使用外部文件 (
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 详细信息,我注意到一些数据被破坏并且出现了疯狂的符号。发生什么事了?
根据文档的示例,
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
必须的原因被使用,因为否则没有人知道文本在哪里结束:
尝试用空终止符来终止字符串值
\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