ZBLOG

win32 c++ 设置二进制文件属性中详细信息中的属性值

在 Windows 系统中,二进制文件(或其他文件)的 “详细信息” 选项卡中的属性(如作者、版本、版权等)属于文件的 元数据(Metadata),需要通过 资源文件(.rc) 或 Win32 API 操作文件的版本信息块(Version Information Resource)。以下是具体方法:


1. 通过 .rc 资源文件定义属性

(1) 创建资源脚本文件(.rc

  1. #include <windows.h>
  2. VS_VERSION_INFO VERSIONINFO
  3. FILEVERSION 1,0,0,0 // 文件版本号
  4. PRODUCTVERSION 1,0,0,0 // 产品版本号
  5. FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
  6. FILEFLAGS 0 // 通常为 0 (正式版)
  7. FILEOS VOS_NT_WINDOWS32 // 目标操作系统
  8. FILETYPE VFT_APP // 文件类型 (应用程序)
  9. FILESUBTYPE VFT2_UNKNOWN
  10. BEGIN
  11. BLOCK "StringFileInfo"
  12. BEGIN
  13. BLOCK "040904b0" // LangID: 英语(美国), UTF-16
  14. BEGIN
  15. VALUE "CompanyName", "ZeroSound Inc.\0"
  16. VALUE "FileDescription", "Sample Binary\0"
  17. VALUE "FileVersion", "1.0.0.0\0"
  18. VALUE "ProductName", "ZeroSound Product\0"
  19. VALUE "LegalCopyright", "© 2023 ZeroSound\0"
  20. END
  21. END
  22. BLOCK "VarFileInfo"
  23. BEGIN
  24. VALUE "Translation", 0x409, 1200 // English (US), Unicode
  25. END
  26. END

**(2) 编译时链接资源文件

  • Visual Studio:将 .rc 文件添加到项目,编译时会自动生成 .res 并嵌入到二进制文件中。
  • 命令行
  1. rc.exe my_resource.rc # 生成 .res
  2. link.exe my_obj.obj my_res.res # 链接到可执行文件

**2. **通过 Win32 API 动态修改/读取属性

使用以下 API 操作版本信息:

**(1) 获取版本信息块大小

  1. DWORD dwSize = GetFileVersionInfoSize("example.exe", NULL);
  2. if (dwSize == 0) {
  3. DWORD err = GetLastError();
  4. }

**(2) 读取版本信息

  1. std::vector<BYTE> buffer(dwSize);
  2. if (!GetFileVersionInfo("example.exe", NULL, dwSize, &buffer[0])) {
  3. // Handle error...
  4. }
  5. // Query specific metadata (e.g., FileDescription)
  6. VS_FIXEDFILEINFO* pFileInfo;
  7. UINT len;
  8. VerQueryValue(&buffer[0], _T("\\"), (LPVOID*)&pFileInfo, &len);
  9. // Query string values (e.g., CompanyName)
  10. LPVOID lpValue;
  11. VerQueryValue(&buffer[0], _T("\\StringFileInfo\\040904b0\\CompanyName"), &lpValue, &len);
  12. _tprintf(_T("Company: %s\n"), (LPCTSTR)lpValue);

**(3) 动态修改属性

需替换文件的版本信息资源块,通常需要以下步骤:

  1. BeginUpdateResource
  2. UpdateResource
  3. EndUpdateResource

示例代码较复杂,通常建议直接修改 .rc 后重新编译。


3. *关键注意事项*

  • 权限要求:修改已存在的二进制文件需要管理员权限。
  • 签名影响:修改元数据会破坏数字签名,需重新签名。
  • Unicode支持:始终使用宽字符 API (GetFileVersionInfoW)。
  • 常见错误码
    • ERROR_RESOURCE_DATA_NOT_FOUND:无版本信息资源。

如果需要完整的动态修改示例代码或更详细的字段说明,可以进一步探讨!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23105

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?