Borland资源编译器编译RC文件版本信息字段溢出问题咨询
问题根因与解决方案
你遇到的版本字段溢出乱码是Borland Resource Compiler 5.40的已知缺陷,和字符串填充长度没有直接关系:
该版本编译器处理VERSIONINFO块的字符串值时,会随机漏写宽字符串末尾的双字节NULL终止符,导致系统读取版本信息时无法识别字符串结尾,会连续读取后续内存数据直到碰到随机的双字节0,因此出现当前字段值后携带下一个字段标识、乱码的问题。你尝试的30字符填充方案无法覆盖所有对齐场景,因此会出现部分场景正常、部分溢出的情况。
微软VERSIONINFO二进制格式核心规则(公开标准)
- 整个VERSIONINFO块按4字节边界对齐,所有子块(StringFileInfo、Translation块等)也需要遵循4字节对齐要求,不足的位置用0字节填充
- 所有字符串键、字符串值均采用UTF-16LE(小端宽字符)编码,必须以双字节
0x0000作为终止符 - 每个字符串项的结构顺序为:2字节值长度、2字节键长度、可变长度的键(含终止符)、对齐填充、可变长度的值(含终止符)
修复方案
- 给所有VALUE定义的字符串末尾显式添加
\0终止符,示例如下:
VALUE "CompanyName", "VAR_COMPANYNAME\0" VALUE "FileDescription", "VAR_FILEDESCRIPTION\0" // 其余VALUE项均按此规则修改
显式声明的终止符会强制brcc32写入双字节0,不会触发漏写bug,无需额外填充空格。
- 如果修改后仍偶发问题,可以将替换后的字符串总ASCII长度调整为奇数,加
\0后总宽字符字节数刚好为偶数,符合宽字符对齐要求。 - 也可替换为微软资源编译器
rc.exe编译rc文件,不存在该类兼容性缺陷。
内容的提问来源于stack exchange,提问作者Olga Pshenichnikova
相关产品推荐
相关产品推荐

