我试着用以下代码获得图标,但除了.和..能获得文件夹图标外,其他文件及文件夹图标句柄都返回NULL。请高手指点,谢谢。
CFtpFileFind FtpFileFind(m_pFtpConnection);
BOOL bContinue=FtpFileFind.FindFile(_T("*"));
SHFILEINFO FileInfo;
CString sFileName;
if(!bContinue)
{
return;
}for(;;)
{
bContinue=FtpFileFind.FindNextFile();
if(!bContinue)
break;
else
{
sFileName=FtpFileFind.GetFilePath();
SHGetFileInfo(sFileName,NULL,&FileInfo,sizeof(SHFILEINFO),SHGFI_ICON |SHGFI_SMALLICON|SHGFI_OPENICON );
m_ImageList.Add(FileInfo.hIcon);
pListCtrl->SetImageList(&m_ImageList,LVSIL_SMALL);
pListCtrl->InsertItem(i++,FtpFileFind.GetFileName(),i);
}
}
CFtpFileFind FtpFileFind(m_pFtpConnection);
BOOL bContinue=FtpFileFind.FindFile(_T("*"));
SHFILEINFO FileInfo;
CString sFileName;
if(!bContinue)
{
return;
}for(;;)
{
bContinue=FtpFileFind.FindNextFile();
if(!bContinue)
break;
else
{
sFileName=FtpFileFind.GetFilePath();
SHGetFileInfo(sFileName,NULL,&FileInfo,sizeof(SHFILEINFO),SHGFI_ICON |SHGFI_SMALLICON|SHGFI_OPENICON );
m_ImageList.Add(FileInfo.hIcon);
pListCtrl->SetImageList(&m_ImageList,LVSIL_SMALL);
pListCtrl->InsertItem(i++,FtpFileFind.GetFileName(),i);
}
}
改成
sFileName=FtpFileFind.GetFileName();
如果FtpFileFind.IsDirectory() == TRUE then strStdExt = "."
例如,sFileName = "welcome.txt" => strStdExt = ".txt"最后调用
DWORD_PTR bSuccess = SHGetFileInfo(strStdExt, FILE_ATTRIBUTE_NORMAL,
&shFileInfo, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_TYPENAME);
参数不能偷懒!如果bSuccess == S_OK且 shFileInfo.hIcon != NULL
搞定
记得最后还要DestroyIcon(shFileInfo.hIcon)