HIMAGELIST hImageList;
    SHFILEINFO shFi;
    hImageList = (HIMAGELIST)SHGetFileInfo("C:\\",0,&shFi,sizeof(shFi),
SHGFI_SYSICONINDEX|SHGFI_SMALLICON |    SHGFI_USEFILEATTRIBUTES);
//将文件图象列表存入m_ctImageList
m_ctImageList.m_hImageList = hImageList;
CListCtrl *pListCtrl;
pListCtrl=&GetListCtrl(); pListCtrl->SetImageList(&m_ctImageList,LVSIL_SMALL);在这之后我调用了
if(!SHGetFileInfo(str,0,&shFi,sizeof(shFi),SHGFI_ICON|SHGFI_SMALLICON|SHGFI_DISPLAYNAME))
{
AfxMessageBox("不能识别的文件");
return;
}
这里就出错了,比如我在FTP服务器上找到一个aaa的目录,str="aaa\\",调用上面的函数就返回0值,这是为什么?我在本地磁盘上也是找到一个aaa的目录,str="aaa\\",这样不会出错的.请教.

解决方案 »

  1.   

    对FTP服务器上文件的访问,
    和对本地文件的访问,
    原理是完全不同.
      

  2.   

    look this:int GetFileIcon(LPCTSTR pszFile)
    {
    if (AfxIsValidString(pszFile))
    {
    SHFILEINFO shfi;
    memset(&shfi, 0, sizeof(shfi)); if (SHGetFileInfo(pszFile, 0, &shfi, sizeof(shfi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) == 0)
    {
    return -1;
    }
    return shfi.iIcon;
    } return -1;
    }
    这里给出的文件可以不存在,也就是说只要有文件名就可以了
      

  3.   

    BOOL GetFolderIcon(int& nIcon, int& nOpenIcon)
    {
    TCHAR szPath[MAX_PATH] = { 0 };
    if (GetSystemDirectory(szPath, MAX_PATH) == 0)
    {
    nIcon     = -1;
    nOpenIcon = -1; return FALSE;
    } /* 得到普通文件夹图标索引 */
    SHFILEINFO shfi;
    memset(&shfi, 0, sizeof(SHFILEINFO));
    SHGetFileInfo(szPath, 0, &shfi, sizeof(SHFILEINFO), \
    SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    nIcon = shfi.iIcon; /* 得到打开文件夹图标索引 */
    memset(&shfi, 0, sizeof(SHFILEINFO));
    SHGetFileInfo(szPath, 0, &shfi, sizeof(SHFILEINFO), \
    SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
    nOpenIcon = shfi.iIcon; return TRUE;
    }这是得文件夹图标的, 需要自己判断是不是文件夹,错了不赖我 :)。
      

  4.   

    SHGetFileInfo这个可以找到本地的文件图标
    ftp服务器上的可能不能用这个吧
      

  5.   

    目前大部分的 FTP 软件都是这样用的,具体请参见 CuteFTP pro 和 FlashFXP
    .此方法是目前看来(个人看法)只是在得到可执行文件的图标时有一点问题,如果需要正确的得到
    可执行文件的图标,过程太复杂,好像有点不太值当。