Win32 MFC中如何从嵌入资源生成IStream格式图标流?
将嵌入资源中的ICO转换为wil::com_ptr的实现步骤
1. 把ICO文件嵌入为可执行资源
打开项目的资源脚本(.rc文件),添加ICO资源的定义:
// 先在resource.h中定义资源ID,示例: // #define IDI_SETTINGS_ICO 101 IDI_SETTINGS_ICO ICON "res\\settings.ico"
将"res\\settings.ico"替换为你的ICO文件在项目中的实际路径,确保文件已放置到对应目录。
2. 从资源加载并生成IStream对象
用以下代码替换原本地文件加载逻辑:
wil::com_ptr<IStream> iconStreamPdfSettings; // 定位资源 HRSRC hResHandle = FindResource(nullptr, MAKEINTRESOURCE(IDI_SETTINGS_ICO), RT_ICON); if (!hResHandle) { // 此处添加资源查找失败的处理逻辑 return; } // 加载资源到全局内存 HGLOBAL hResData = LoadResource(nullptr, hResHandle); if (!hResData) { // 处理资源加载失败 return; } // 基于资源内存创建IStream CHECK_FAILURE(CreateStreamOnHGlobal(hResData, FALSE, &iconStreamPdfSettings));
关键细节说明
CreateStreamOnHGlobal的第二个参数传FALSE,表示不会自动释放传入的全局内存句柄——资源内存由系统管理,无需手动释放。- 沿用原代码的
CHECK_FAILURE做COM调用错误检测,保持一致的错误处理风格。 - 若要处理其他ICO资源,只需替换对应的资源ID即可。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

