在SHBrowseForFolder()函数的输出参数中,只能得到用户所选文件夹的相对路径,如何能得到绝对路径?

解决方案 »

  1.   

    static char aa[225];//CSIDL_DESKTOPDIRECTORY
    LPITEMIDLIST pidlBeginAt, pidlDestination ;
    SHGetSpecialFolderLocation(HWND_DESKTOP, nBeginAt, &pidlBeginAt) ;// 取得开始菜单或桌面的PIDL
    BROWSEINFO BrInfo;
    ZeroMemory(&BrInfo, sizeof(BrInfo));
    BrInfo.hwndOwner = HWND_DESKTOP;//可不用
    BrInfo.pidlRoot = pidlBeginAt;
    BrInfo.lpszTitle = lpszTitle;
    pidlDestination= SHBrowseForFolder(&BrInfo);//浏览文件夹
    if(NULL == pidlDestination)//用户选择了取消按钮
    return "";
    SHGetPathFromIDList(pidlDestination,aa);// 把PIDL转换为路径名 
    return aa;好像在取得的结果中就是绝对屡经,不过如果返回 C: 等需要单独判断一下结尾的 \
      

  2.   

    //下面是一个包装后的GetPath函数:
    int CALLBACK BrowseCallbackProc(HWND hWnd,UINT msg,LPARAM lParam,LPARAM lpData)
    {
    if((msg & BFFM_INITIALIZED) == BFFM_INITIALIZED)
    SetWindowText(hWnd,(char *)lpData);
    return 0;
    }BOOL GetPath(char *szPath, char *szTitle, char *szDlgTitle)
    {
    BROWSEINFO bi;
    LPITEMIDLIST lpi; bi.hwndOwner = m_hWnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = NULL;
        bi.lpszTitle = szTitle;
        bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_RETURNFSANCESTORS;
        bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;
        bi.lParam = (LPARAM)szDlgTitle;
    bi.iImage = 0;
    lpi = SHBrowseForFolder(&bi);
    if(lpi == NULL) return FALSE; LPMALLOC     pMalloc;
    SHGetMalloc(&pMalloc);
    SHGetPathFromIDList(lpi,szPath);
    pMalloc->Free(lpi);
    pMalloc->Release();
    return TRUE;
    }
      

  3.   

    本人从MSDN的例子中也找到了SHGetPathFromIDList().
    非常感谢两位的热心解答!