在w64devkit的app.rc文件中如何将version.txt作为.exe元数据置于.rsrc根目录
嘿,我来帮你搞定这个问题!你想把version.txt嵌入到.exe的.rsrc根目录下,而且不想把它归类到像ICON、MANIFEST这类预定义资源类型里,对吧?之前直接在RC文件里写version.txt导致windres报语法错误,是因为RC脚本要求必须明确指定资源的类型、ID/名称和文件路径,不能只写文件名。
先理清楚PE资源的结构逻辑
首先得明确一点:PE文件的资源系统是分层的,.rsrc目录下首先是资源类型(比如预定义的RT_ICON、RT_MANIFEST、RT_VERSION,或者你自定义的类型),然后是资源ID/名称,最后是语言ID。严格来说没法把文件直接放在.rsrc最根目录,但你可以通过自定义资源类型或名称,让它实现类似“根级显示”的效果。
方法1:将version.txt作为自定义根级资源
如果你想让version.txt作为一个独立的、类似VS_VERSION_INFO那样的根级资源项,可以在app.rc文件的现有内容后添加这一行:
2 "VERSION_FILE" "version.txt"
2是资源ID(要避开已用的ID,比如你已经把1分给了MANIFEST和ICON,所以换个不冲突的数字就行)"VERSION_FILE"是自定义的资源类型名称(你也可以直接写成"version.txt",让类型名和文件名一致)"version.txt"是你要嵌入的本地文件路径
编译后在资源浏览器里,你会看到.rsrc下多了VERSION_FILE类型目录,里面就是嵌入的version.txt资源。
方法2:将version.txt作为RCDATA通用资源
如果只是想嵌入文件内容,不需要自定义类型,用预定义的RCDATA类型更通用,写法如下:
"version.txt" RCDATA "version.txt"
这里第一个"version.txt"是资源的显示名称,RCDATA是系统预定义的资源类型,第二个"version.txt"是本地文件路径。编译后它会出现在.rsrc\RCDATA\version.txt路径下,也是很常用的嵌入方式。
整合后的完整app.rc示例
把自定义资源的写法加到你现有的RC代码里,最终文件会是这样:
1 MANIFEST "app.manifest" 1 ICON "app.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "sfsfsfo" VALUE "FileVersion", "tacobell" VALUE "InternalName", "errrertet" VALUE "LegalCopyright", "beellf©©©©©©" VALUE "OriginalFilename", "sffsgs.exe" VALUE "ProductName", "dssfesfdfsf" VALUE "ProductVersion", "1,0,0,0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END # 新增:将version.txt作为自定义根级资源 2 "VERSION_FILE" "version.txt"
用w64devkit的windres编译这个RC文件,生成的.exe里就会包含你要的version.txt资源啦。
内容来源于stack exchange

