CFileDialog FDlg(TRUE);//用打开文件对话框获取文件名
CImageList IconList;
SHFILEINFO fileInfo = {0};
FileName = FDlg.GetPathName();ret = SHGetFileInfo(FileName, 0,&fileInfo, sizeof(fileInfo), SHGFI_ICON|SHGFI_SMALLICON|SHGFI_DISPLAYNAME);
HICON hIcon = fileInfo.hIcon;//调试执行时获取的图标hIcon (expression can not be envaluted)
IconList.Add(hIcon);//出错调试时查看fileInfo.szDisplayName为正常文件名,而为什么获取图标句柄会失败?

解决方案 »

  1.   

    调试时查看fileInfo.szDisplayName为正常文件名,而为什么获取图标句柄会失败? 
    ========
    试了一下你的代码,发现SHGetFileInfo没有错误,HICON hIcon也是正确的,主要原因是CImageList,这个建立一个变量后,还要调用Create才能工作.
      

  2.   

    貌似不一定非要使用CImageList的,直接取一个也是可以的。
    LZ试下这样写参数::SHGetFileInfo(strOpenFileName,0,&shfileinfo,sizeof(shfileinfo),SHGFI_ICON)
      

  3.   

    你的IconList要在之前初始化
    IconList.Create(24,24,ILC_COLOR32|ILC_MASK,10,10);  //生成图标列表
    另外掘取图标这么写
    if(SHGetFileInfo(FileName, 0,&fileInfo, sizeof(fileInfo), SHGFI_ICON))
    {
    IconList.Add(fileInfo.hIcon); 
    }
      

  4.   

    貌似不一定非要使用CImageList的,直接取一个也是可以的。 
    LZ试下这样写参数 
    ================
    不用CImageList当然是可以的,他的代码SHGetFileInfo用的是对的,取得的HICON也是正确的,他的IconList.Add(hIcon);不能工作的原因是因为IConList没有先Create,所以Add出错。
      

  5.   

    CImageList* imageList = m_SysImageList.GetImageList(FALSE); // 得到大图标链表
    SetImageList(imageList, LVSIL_NORMAL);                      // 设置图标链表
    imageList->Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 50, 50);//CImageList对象建立后,还要调用Create才能工作! /*TCHAR shortName[MAX_PATH];