记句柄泄漏

SHGetFileInfo函数介绍https://baike.baidu.com/item/SHGetFileInfo

用来获取系统图标,一定要记得用完释放,否则就会出现句柄泄漏;

    SHFILEINFO sfi = { 0 };
    DWORD_PTR dwRet = SHGetFileInfo((LPCWSTR)m_shellPath.DataBuf, 0, &sfi, sizeof(sfi),
		SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_PIDL | SHGFI_ATTRIBUTES | SHGFI_ICON);
    DestroyIcon(sfi.hIcon);

如果程序中有一个线程一直调用,或者定时器一直刷新,那么GDI对象会一直增多,知道达到9999,程序就会死掉;本以为SHFILEINFO sfi = { 0 };会在函数括号结束就会自动析构,然而句柄对象会一直存在,走进误区。

typedef struct _SHFILEINFOW
{
        HICON       hIcon;                      // out: icon
        int         iIcon;                      // out: icon index
        DWORD       dwAttributes;               // out: SFGAO_ flags
        WCHAR       szDisplayName[MAX_PATH];    // out: display name (or path)
        WCHAR       szTypeName[80];             // out: type name
} SHFILEINFOW;
#ifdef UNICODE
typedef SHFILEINFOW SHFILEINFO;
#else
typedef SHFILEINFOA SHFILEINFO;
#endif // UNICODE

 可见该结构体并没有析构函数去析构 成员(HICON       hIcon);然而SHGetFileInfo却创建了对象。(结构体概念与类的对象的概念模糊,没理解清楚,待深入)

 

每一次的努力都会有结果,坚持需要得到结果,感谢波哥教了很多!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值