version.rc中#define定义的字符串未在可执行文件中生效问题
问题排查与解决方案
以下是导致自定义版本资源无法正常显示的常见原因及修复方法:
1. RC文件版本资源结构不规范
版本资源必须严格遵循VS_VERSION_INFO的标准结构,任何语法错误都会导致资源管理器无法识别:
- 必须包含
StringFileInfo和VarFileInfo两个顶级块,其中VarFileInfo里的Translation项要和StringFileInfo下的语言代码页块匹配(比如0x409对应英文,1200对应UTF-16)。 - 每个
VALUE项的格式必须是VALUE "键名", "值",如果用#define宏,确保宏展开后是完整的带引号字符串。 - 示例正确结构:
#define COMPANY_NAME "XX科技有限公司" #define PRODUCT_NAME "XX工具V1.0" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x3fL FILEOS 0x4L FILETYPE 0x1L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", COMPANY_NAME VALUE "ProductName", PRODUCT_NAME VALUE "FileVersion", "1.0.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END
2. #define宏展开异常
如果宏定义时未添加引号,或者宏内容包含特殊字符未转义,会导致RC编译后字符串内容异常:
- 错误示例:
#define COMPANY_NAME XX科技(无引号,RC会将其识别为标识符而非字符串) - 正确示例:
#define COMPANY_NAME "XX科技"(直接包含引号,确保展开后是合法字符串)
3. RES文件未重新编译
Delphi可能会复用旧的.res文件,导致修改后的RC内容未生效:
- 手动删除旧的
version.res文件,让Delphi通过{$R 'version.res' 'version.rc'}指令重新编译RC生成新的RES。 - 或者直接用命令行工具编译:
brcc32 version.rc,将生成的RES文件替换到项目目录。
4. 项目设置残留冲突
即使关闭了“包含版本信息”选项,仍可能存在自动生成的版本资源干扰:
- 打开项目的
.dproj文件,确认<IncludeVersionInfo>标签值为False。 - 检查项目中是否还有其他资源文件(如默认的
Project1.res)包含版本信息,如有则移除或修改。
5. 编码问题导致字符串乱码
如果RC文件包含非ASCII字符,未指定编码会导致资源内容异常:
- 在RC文件开头添加编码声明:
#pragma code_page(65001)(指定UTF-8编码),确保特殊字符能正确编译。
内容的提问来源于stack exchange,提问作者John John
相关产品推荐
相关产品推荐

