SHGetFileInfo 调用N次后罢工。怎么回事。

gaoyue_qq_1664507529 2012-02-26 05:18:54
我用CListCtr做了一个,类似资源管理器,查看目录文件的东东,使用SHGetFileInfo 文件相关信息。我运行程序,查看了一个system32运行结果正确,接着查其它目录,SHGetFileInfo 结果没有得到图标信息,返回值为NULL,下断点,参数传递没有问题的,这是为什么呢。。。。。按理说,参数没问题,每次运行结果,都相同才对啊。。。。。
...全文
95 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
问题解决了,是因为FileInfo.hIcon资源没有释放掉。


CImageList *old1,*old2;
old1=m_listCtrl.SetImageList(pImageListNormal,LVSIL_NORMAL);
if(old1)
delete old1;//这么写只是释放了CImageList 但里面放置的图标资源并没有释放掉,所以导致资源泄漏了。

old2=m_listCtrl.SetImageList(pImageListSmall,LVSIL_SMALL);
if(old2)
delete old2;


非常感谢“列宁”同志。。。
  • 打赏
  • 举报
回复
已经看过了,内存,最高时占用:20.000K左右;最少5.000K左右。当出毛病的时候,内存使用。6。000K左右。好像没什么异常啊。唉,这个问题,真难搞啊。。。
Lactoferrin 2012-02-26
  • 打赏
  • 举报
回复
去掉SHGFI_SYSICONINDEX试试
我原来做这样的程序时好像就是因为没有释放hIcon导致失败
  • 打赏
  • 举报
回复
SHGetFileInfo(str, 0, &FileInfo, sizeof(FileInfo),SHGFI_ICON|SHGFI_SYSICONINDEX );
返回值,非0值。
Lactoferrin 2012-02-26
  • 打赏
  • 举报
回复
你看一下你的进程占多少内存
  • 打赏
  • 举报
回复
CImageList *old1,*old2;
old1=m_listCtrl.SetImageList(pImageListNormal,LVSIL_NORMAL);
if(old1)
delete old1;//这么写的,

old2=m_listCtrl.SetImageList(pImageListSmall,LVSIL_SMALL);
if(old2)
delete old2;
Lactoferrin 2012-02-26
  • 打赏
  • 举报
回复
你是不是没有释放hIcon,占得太多了
Lactoferrin 2012-02-26
  • 打赏
  • 举报
回复
SHGetFileInfo返回值多少
  • 打赏
  • 举报
回复

pImageListNormal->Add(FileInfo.hIcon);流览一阵后,这里:FileInfo.hIcon为0,但FileInfo.iIcon有值
  • 打赏
  • 举报
回复
//是一个普通目录或文件名;
CFileFind finder;

BOOL bWorking = finder.FindFile(m_strDir+L"\\*.*");//如果能找到,则strPath是一个目录,否则是一个普通文件
int index=0;
while (bWorking)
{
bWorking = finder.FindNextFile();
if(finder.IsDots()) //如果找到的是点,结束本次循环。
{
continue;
}
SHFILEINFO FileInfo;
FileInfo.hIcon=0;
memset(&FileInfo,0,sizeof(SHFILEINFO));
CString str=finder.GetFilePath();

if(finder.IsDirectory())
{
SHGetFileInfo(str, 0, &FileInfo, sizeof(FileInfo),SHGFI_ICON|SHGFI_SYSICONINDEX );
}else
{
SHGetFileInfo(str, 0, &FileInfo, sizeof(FileInfo),SHGFI_ICON|SHGFI_SYSICONINDEX );
}


pImageListNormal->Add(FileInfo.hIcon);

pImageListSmall->Add(FileInfo.hIcon);

m_listCtrl.InsertItem(0,finder.GetFileName(),index++);

}
Lactoferrin 2012-02-26
  • 打赏
  • 举报
回复
代码是什么

15,471

社区成员

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

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