SHGetFileInfo调用N次后罢工,救命!该怎么处理
SHGetFileInfo调用N次后罢工,救命!
如上:代码如下,看了内存会增长很快,真心找不到问题所在,感觉是SHGetFileInfo是它调用很多次后,把内存弄得很高,结果后面图标就不见了!什么情况啊。
------解决方案--------------------
参考下面文章,试试直接用iIcon,不用hIcon
http://www.cnblogs.com/jianu/archive/2011/05/12/2044885.html
------解决方案--------------------
觉得你这个遍历逻辑上有些问题?一般的先得到文件路径,先过滤.和..,SHGetFileInfo得到文件图标,Add到CImageList中,然后DestroyIcon()删除,然后再去判断是否是目录还是文件,如果是目录的话,再递归
------解决方案--------------------
1.imageList有必要循环Add么?放全局吧。加载一次就可以了。
反正图标一直要显示的。
2.
MSDN:
Do not use this function to destroy a shared icon. A shared icon is valid as long as the module from which it was loaded remains in memory. The following functions obtain a shared icon.
不要删除一个共享的图标,
只要这个图标任然在内存中使用,就被定义为一个共享图标
CreateIconFromResourceEx CreateIconIndirect and CopyIcon.
才用DestroyIcon
------解决方案--------------------
图标没有了。。单步看看有没有添加图标。。。
------解决方案--------------------
提出几个问题:
1. 你的文件查找与判断的循环不太恰当。通常都是这么写的:
如上:代码如下,看了内存会增长很快,真心找不到问题所在,感觉是SHGetFileInfo是它调用很多次后,把内存弄得很高,结果后面图标就不见了!什么情况啊。
- C/C++ code
while(hfile!= INVALID_HANDLE_VALUE ) { strTemp = fileDate.cFileName; if(!SHGetFileInfo(start+_T("\\")+strTemp,0,&shFi,sizeof(SHFILEINFO),SHGFI_ICON)&& strTemp != "." && strTemp != "..") { if(SHGetFileInfo(start+_T("\\")+strTemp,0,&shFi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_PIDL)) goto line; break; } line: if((fileDate.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strTemp != "." && strTemp != ".."){ //posFile=imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); posFile=imageList.Add(shFi.hIcon); root=treeCtrl.InsertItem(strTemp,posFile,posFile,TVI_ROOT,root); DestroyIcon(shFi.hIcon); //MessageBox(_T("dgd")); } if(!(fileDate.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strTemp != "." && strTemp != ".."){ pos=imageList.Add(shFi.hIcon); DestroyIcon(shFi.hIcon); item=treeCtrl.InsertItem(strTemp,pos,pos,TVI_ROOT,item); } bool isNextFile = FindNextFile(hfile,&fileDate);//判断该目录下是否还有文件 if(isNextFile == 0) { break; } }
------解决方案--------------------
参考下面文章,试试直接用iIcon,不用hIcon
http://www.cnblogs.com/jianu/archive/2011/05/12/2044885.html
------解决方案--------------------
觉得你这个遍历逻辑上有些问题?一般的先得到文件路径,先过滤.和..,SHGetFileInfo得到文件图标,Add到CImageList中,然后DestroyIcon()删除,然后再去判断是否是目录还是文件,如果是目录的话,再递归
------解决方案--------------------
1.imageList有必要循环Add么?放全局吧。加载一次就可以了。
反正图标一直要显示的。
2.
MSDN:
Do not use this function to destroy a shared icon. A shared icon is valid as long as the module from which it was loaded remains in memory. The following functions obtain a shared icon.
不要删除一个共享的图标,
只要这个图标任然在内存中使用,就被定义为一个共享图标
CreateIconFromResourceEx CreateIconIndirect and CopyIcon.
才用DestroyIcon
------解决方案--------------------
图标没有了。。单步看看有没有添加图标。。。
------解决方案--------------------
提出几个问题:
1. 你的文件查找与判断的循环不太恰当。通常都是这么写的:
- C/C++ code
HANDLE hFindFile; WIN32_FIND_DATA w32fd; hFindFile = FindFirstFile(szWildcard, &w32fd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if (w32fd.cFileName == _T(".") || w32fd.cFileName != _T("..")) { continue; } if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // } else { // } } while (FindNextFile(hFindFile, &w32fd)); FindClose(hFindFile); }