MFC中使用BROWSEINFO来选择文件夹的问题
voidCUserInterfaceDlg::OnBnClickedOpenButton(){//TODO:在此添加控件通知处理程序代码CStringsFolderPat...
void CUserInterfaceDlg::OnBnClickedOpenButton()
{
// TODO: 在此添加控件通知处理程序代码
CString sFolderPath;
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
// int m = 0;
//LPWSTR Buffer = NULL;
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;//初始化制定的root目录很不容易,
// bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = _T("请选择一个文件夹:");
bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;//包括文件
bi.lpfn = NULL;
bi.iImage = IDR_MAINFRAME;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if (pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
// m = strlen(Buffer);
//取得文件夹路径到Buffer里
sFolderPath = Buffer;//将文件夹路径保存在一个CString对象里
// std::cout<<sFolderPath;
SetDlgItemText(IDC_EDIT1, sFolderPath);
}
LPMALLOC lpMalloc;
if (FAILED(SHGetMalloc(&lpMalloc)))
return;
lpMalloc->Free(pIDList);
lpMalloc->Release();
// MessageBox(sFolderPath,(LPCTSTR)"Title",MB_OK);
}
上面是打开文件夹按钮的响应函数,下面是初始化
CUserInterfaceDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
为什么一点打开,INT_PTR nResponse = dlg.DoModal();就读取位置 0xCCCCCCCC 时发生访问冲突。 展开
{
// TODO: 在此添加控件通知处理程序代码
CString sFolderPath;
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
// int m = 0;
//LPWSTR Buffer = NULL;
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;//初始化制定的root目录很不容易,
// bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = _T("请选择一个文件夹:");
bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;//包括文件
bi.lpfn = NULL;
bi.iImage = IDR_MAINFRAME;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if (pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
// m = strlen(Buffer);
//取得文件夹路径到Buffer里
sFolderPath = Buffer;//将文件夹路径保存在一个CString对象里
// std::cout<<sFolderPath;
SetDlgItemText(IDC_EDIT1, sFolderPath);
}
LPMALLOC lpMalloc;
if (FAILED(SHGetMalloc(&lpMalloc)))
return;
lpMalloc->Free(pIDList);
lpMalloc->Release();
// MessageBox(sFolderPath,(LPCTSTR)"Title",MB_OK);
}
上面是打开文件夹按钮的响应函数,下面是初始化
CUserInterfaceDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
为什么一点打开,INT_PTR nResponse = dlg.DoModal();就读取位置 0xCCCCCCCC 时发生访问冲突。 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询