在 Windows 二进制文件(如 .exe
或 .dll
)中新增原本不存在的属性,需要直接修改其版本信息资源(Version Information Resource)。以下是具体方法和注意事项:
方法 1:通过资源脚本(.rc
)重新编译
适用场景
- 你有源代码和编译环境(如 Visual Studio)。
- 需永久添加新属性。
步骤
- 编辑
.rc
文件
在StringFileInfo
块中添加新字段:VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
BEGIN
BLOCK "040904b0" // English (US), Unicode
BEGIN
VALUE "OriginalField", "Value\0" // 原有字段
VALUE "NewCustomField", "NewValue\0" // 新增自定义字段
END
END
- 重新编译项目
编译器会将新字段嵌入二进制文件。
方法 2:动态修改已存在的二进制文件
适用场景
- 无源代码,需直接操作二进制文件。
- 注意:会破坏数字签名。
步骤(使用 Win32 API)
检查现有版本信息
用GetFileVersionInfo
+VerQueryValue
确认是否已有版本资源:DWORD dummy;
DWORD size = GetFileVersionInfoSize("target.exe", &dummy);
if (size == 0) {
// 无版本信息块,需从头创建
}
构造新的版本信息资源
若原文件无版本信息或需新增字段,需手动构造完整的资源数据。
格式参考:MSDN Version Information Structure。更新资源
使用BeginUpdateResource
+UpdateResource
: “`cpp HANDLE hUpdate = BeginUpdateResource(“target.exe”, FALSE);
// lpData: 指向包含新字段的完整版本信息数据(VS_VERSIONINFO结构) UpdateResource(
hUpdate,
RT_VERSION,
MAKEINTRESOURCE(VS_VERSION_INFO),
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
lpData,
dwSize);
EndUpdateResource(hUpdate, FALSE);
---
### *关键细节*
1. **数据结构要求**
新增字段必须符合 `VS_VERSIONINFO` 结构,包括:
- `StringFileInfo`:字符串表(如 `040904b0`)。
- `VarFileInfo`:语言和编码标识。
2. *示例新增字段*
假设原文件无任何属性,新增一个自定义公司名:
```rc
VERSIONINFO
FILEVERSION 1,0,0,0
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "ZeroSound Education\0"
VALUE "CustomField", "Added Dynamically\0"
END
END
- 工具辅助
- *Resource Hacker*:可视化添加字段。
- *Visual Studio*:右键
.exe
→ Properties → Details → Edit via.rc
.
- 签名问题
修改后需重新签名:
signtool sign /f mycert.pfx /p password target.exe
完整代码片段
若需要动态构造并插入全新版本信息块,可参考以下伪代码逻辑:
// 1. Build VS_VERSIONINFO structure manually (binary format)
BYTE* lpData = BuildCustomVersionInfo("MyApp", "2.0", ...);
// 2. Update binary file
HANDLE hRes = BeginUpdateResource("app.exe", FALSE);
UpdateResource(hRes, RT_VERSION, ..., lpData);
EndUpdateResource(hRes, FALSE);
// Helper function to generate binary data
BYTE* BuildCustomVersionInfo(...) { /* Pack strings+structure */ }
提供具体需求后可进一步优化代码!
内容由零声教学AI助手提供,问题来源于学员提问