讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何读取和修改可执行文件的图标资源_Win32资源API应用【实战】

冬辰姑娘_1003

冬辰姑娘_1003

发布时间:2026-03-25 19:09:31

|

222人浏览过

|

来源于php中文网

原创

必须按RT_GROUP_ICON+RT_ICON结构构造新图标并读取原语言ID,否则图标不显示;UpdateResource需传字符串资源名、正确类型宏,且替换后签名失效、高DPI需PNG格式。

c++如何读取和修改可执行文件的图标资源_win32资源api应用【实战】

用 UpdateResource 替换图标前必须理解资源结构

Windows 可执行文件的图标不是独立文件,而是嵌在 .rsrc 节里的多层资源:先有 RT_GROUP_ICON(图标组),再指向多个 RT_ICON(实际位图数据)。直接写入单个 RT_ICON 会破坏引用关系,导致图标不显示或资源损坏。

  • 必须先用 FindResource + LoadResource 读出原始 RT_GROUP_ICON,解析其内部 GRPICONDIR 和 GRPICONENTRY,确认有多少个尺寸/色深变体
  • 新图标资源也得按同样结构构造:一个 RT_GROUP_ICON + 若干匹配的 RT_ICON,否则 Explorer 加载时跳过整个组
  • UpdateResource 的第三个参数(语言 ID)不能硬写 MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),要从原资源中读取,否则多语言 exe 里图标只在部分区域生效

修改只读文件时 CreateFile 必须带 GENERIC_WRITE 和 FILE_SHARE_WRITE

直接对正在运行或被系统锁定的 exe 调用 BeginUpdateResource 会失败,错误码通常是 ERROR_ACCESS_DENIED。这不是权限问题,而是文件句柄没开对。

  • 调用 CreateFile 时,dwDesiredAccess 至少含 GENERIC_WRITE,dwShareMode 必须含 FILE_SHARE_WRITE(即使你只是改资源,系统内部会重写整个 PE 文件)
  • 不要用 CREATE_ALWAYS 或 TRUNCATE_EXISTING,这会清空原文件;应选 OPEN_EXISTING,否则签名、校验和、ASLR 信息全丢
  • 如果目标 exe 是 64 位而你的工具是 32 位(或反之),BeginUpdateResource 可能静默失败——Win32 资源 API 不报架构不匹配错误,但后续 UpdateResource 返回 FALSE 且 GetLastError() 是 ERROR_INVALID_PARAMETER

UpdateResource 失败时优先检查资源名和类型是否为字符串而非整数

图标资源名常见写成 MAKEINTRESOURCE(1),但这是给编译器用的宏;运行时调用 UpdateResource 必须传真实字符串指针,比如 "1" 或 "MAINICON"。传 MAKEINTRESOURCE(1) 会导致 ERROR_RESOURCE_NAME_NOT_FOUND。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用 EnumResourceNames 实际扫一遍目标文件,确认图标组名到底是整数(如 1)还是字符串(如 "IDI_MAINFRAME"),别凭头文件猜
  • RT_GROUP_ICON 和 RT_ICON 类型必须用宏,不能写数字 14/3——虽然值一样,但 WinSDK 头文件可能因平台定义不同,硬编码易出错
  • 替换后立即用 EndUpdateResource(hUpdate, FALSE) 测试:若返回 FALSE,说明资源结构非法;此时用 EndUpdateResource(hUpdate, TRUE) 丢弃更改,避免写坏原文件

签名失效和兼容性陷阱比代码更难处理

只要调用 UpdateResource 写入任何内容,exe 的 Authenticode 签名就作废,Windows SmartScreen 会直接拦截,UAC 提示变成“未知发布者”。这不是 bug,是设计如此。

立即学习“C++免费学习笔记(深入)”;

  • 没有绕过签名失效的办法,重签名需要私钥和证书工具链(signtool.exe + PFX),普通开发环境通常不具备
  • 某些杀软把资源修改行为当恶意特征,尤其连续修改多个文件时,可能触发实时防护阻断 WriteFile
  • Windows 11 对高 DPI 图标要求更严:旧版只放 32×32 和 16×16,现在至少得提供 256×256 PNG 压缩格式(RT_ICON 里存 PNG 数据),否则高分屏下模糊或回退到默认图标

真正麻烦的从来不是 API 调用顺序,而是资源结构必须手工对齐、签名无法自动恢复、以及高 DPI 下图标数据格式的隐式升级要求。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5949

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7554

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11254

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5779

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6367

2025.08.07

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn