读书人

SHGetFileInfo调用N次后罢工救命!该

发布时间: 2012-11-07 09:56:10 作者: rapoo

SHGetFileInfo调用N次后罢工,救命!
如上:代码如下,看了内存会增长很快,真心找不到问题所在,感觉是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);} 

读书人网 >VC/MFC

热点推荐