我试着用以下代码获得图标,但除了.和..能获得文件夹图标外,其他文件及文件夹图标句柄都返回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);
   }
}

解决方案 »

  1.   

    楼上讲得没错!当然,如果是那种妖怪后缀名的话,你就定义一个默认ico好了。
      

  2.   

    sFileName=FtpFileFind.GetFilePath();
    改成
     sFileName=FtpFileFind.GetFileName();
      

  3.   

    然后获得文件的扩展名放到strStdExt(自己定义的)中,自己解析
    如果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)
      

  4.   

    多谢Realdodo的指点。我试了试,完成了。再次感谢。