前言
关键字:SHBrowseForFolder、SHGetPathFromIDList
问题很菜,在网上找了一段想当然的代码改吧改吧,结果报错了,甚至都不知道错哪里,调试也没法跟踪。
正文
一、问题代码
CString szPath;
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath.GetBuffer();
bi.lpszTitle = L " 请选择目录: " ;
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0 ;
bi.iImage = 0 ;
// 弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder( & bi);
if (lp && SHGetPathFromIDList(lp, szPath.GetBuffer()))
AfxMessageBox(szPath);
else
AfxMessageBox(L " 无效的目录,请重新选择 " );
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath.GetBuffer();
bi.lpszTitle = L " 请选择目录: " ;
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0 ;
bi.iImage = 0 ;
// 弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder( & bi);
if (lp && SHGetPathFromIDList(lp, szPath.GetBuffer()))
AfxMessageBox(szPath);
else
AfxMessageBox(L " 无效的目录,请重新选择 " );
二、报错截图
三、解决错误
TCHAR szPath[MAX_PATH];
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
bi.lpszTitle = L " 请选择目录: " ;
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0 ;
bi.iImage = 0 ;
// 弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder( & bi);
if (lp && SHGetPathFromIDList(lp, szPath))
AfxMessageBox(CString(szPath));
else
AfxMessageBox(L " 无效的目录,请重新选择 " );
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
bi.lpszTitle = L " 请选择目录: " ;
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0 ;
bi.iImage = 0 ;
// 弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder( & bi);
if (lp && SHGetPathFromIDList(lp, szPath))
AfxMessageBox(CString(szPath));
else
AfxMessageBox(L " 无效的目录,请重新选择 " );
说明:把CString改成了TCHAR数组。
结束语
折腾很久,搜了老半天,最后把修改前的代码和修改后的代码比较了一下,才猜想出来。
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/583030,如需转载请自行联系原作者