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却创建了对象。(结构体概念与类的对象的概念模糊,没理解清楚,待深入)
每一次的努力都会有结果,坚持需要得到结果,感谢波哥教了很多!