SHBrowseForFolder()函数的使用 在SHBrowseForFolder()函数的输出参数中,只能得到用户所选文件夹的相对路径,如何能得到绝对路径? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static char aa[225];//CSIDL_DESKTOPDIRECTORYLPITEMIDLIST pidlBeginAt, pidlDestination ;SHGetSpecialFolderLocation(HWND_DESKTOP, nBeginAt, &pidlBeginAt) ;// 取得开始菜单或桌面的PIDLBROWSEINFO 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: 等需要单独判断一下结尾的 \ //下面是一个包装后的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;} 本人从MSDN的例子中也找到了SHGetPathFromIDList().非常感谢两位的热心解答! 如何把BYTE型的串,存储到string中,再拿出来 谁知道DLL注入的原理 MFC扩展DLL装载失败~~ 求救 24位真彩色转为256灰度图 二维动态数组怎么定义? 如何让一张张的图片(如jpg)组织成视频文件(如avi)? 求助(在线等待) 如何不让程序在98的任务管理器中出现? 请教一个关于大整数的问题 什么是ASM???什么是DDK??? 为什么程序执行到一半,资源被占用的特别严重,以至于对话框都“白”了 用ado打开和关闭access数据库的问题
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: 等需要单独判断一下结尾的 \
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;
}
非常感谢两位的热心解答!