关于SHGetFileInfo函数GDI对象泄漏的问题

lyyscf 2011-04-27 10:27:15
我用如下语句得到某种类型文件的图标,可以成功。
SHFILEINFO sfi;
SHGetFileInfo(lpszFilePath , FILE_ATTRIBUTE_NORMAL , &sfi , sizeof(SHFILEINFO) ,
SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);

调试时,在window资源管理器中发现本程序的GDI对象在第一次执行这条语句时,增加了差不多30个
我得到的sfi.hIcon用完就释放了
不知道是什么原因,
...全文
161 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlwlxj 2011-05-01
  • 打赏
  • 举报
回复
这种情况属于正常,比如调用打开文件对话框。
lyyscf 2011-04-29
  • 打赏
  • 举报
回复
自己顶
jdzfjfhnui 2011-04-28
  • 打赏
  • 举报
回复
经过我测试,发现,调用一次增加了29个GDI对象,在调用一次增加了10个,在调用,就不会增加
lyyscf 2011-04-28
  • 打赏
  • 举报
回复
我加了CoInitialize
OleInitialize 也试了
还是一样,调用SHGetFileInfo会增加20多个GDI对象
lyyscf 2011-04-28
  • 打赏
  • 举报
回复
我也是第一次增加了29个GDI对象,后面就是正常的
不知怎么清理
路杨 2011-04-28
  • 打赏
  • 举报
回复
学习。。。以前一直忽略
lyyscf 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiangsheng 的回复:]

你的icon正在DC中使用的时候,DestoryIcon会失败
[/Quote]
调试过了,DestoryIcon 返回为1
我是在CListBox中自绘的文件图标
除了第一次增加项(调用SHGetFileInfo时) ,再删除项 GDI对象增加了20多个外
后面的都是正常的
蒋晟 2011-04-27
  • 打赏
  • 举报
回复
你的icon正在DC中使用的时候,DestoryIcon会失败
安静苦笑 2011-04-27
  • 打赏
  • 举报
回复
应该注意的是,在调用SHGetFileInfo()之前,必须使用 CoInitialize 或者OleInitialize 初始化COM,否则表面上能够使用,但是会造成不安全或者丧失部分功能。例如,一个常见的例子:如果不初始化COM,那么调用该函数就无法得到.htm/.mht/.xml文件的图标。
lyyscf 2011-04-27
  • 打赏
  • 举报
回复
我已经释放过了
DestoryIcon(sfi.hIcon);
Eleven 2011-04-27
  • 打赏
  • 举报
回复
If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧