。
e.g。
CString szFilter;
szFilter.LoadString(IDC_ALLFILES);
其中IDC_ALLFILES = "All files (*.*)|*.*||"
当我尝试在DoModal()
的同一个实例上执行CFileDialaog
时,它会第二次崩溃。
我创建了一个小样本项目来模拟确切的行为。
我做的第一件事是声明CFileDialog指针如下:
class CFeatureDialogFileDlg : public CDialog
{
private:
CFileDialog* m_pFileDialog;
}
我有两个按钮'Set Flags'和'Open features',如下所示:
void CFeatureDialogFileDlg::OnBnClickedButtonSetFlags()
{
static CString szFilter;
szFilter.LoadStringW(IDC_ALLFILES);
m_pFileDialog = new CFileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,szFilter);
}
void CFeatureDialogFileDlg::OnBnClickedButtonOpenFeatures()
{
if(m_pFileDialog->DoModal() == IDOK){}
}
现在,
我只需单击“设置标志”即可在堆上创建新对象。 然后我点击“打开功能”来调用DoModal()。
第一次被正确调用。 但第二次单击“打开功能”而不单击“设置标志”时,出现错误对话框“文件C中的调试断言失败:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ src \ mfc \ dlgfile.cpp“
如果我点击“忽略”,我会收到“遇到不正确的参数”对话框。
答案 0 :(得分:1)
谢谢大家的回复。
我已经认识到了问题的原因。
在mfc 9中,引入了两个额外的参数,即CFWDialog的dwSize和bVistaStyle。
由于bVistaStyle = TRUE,我们调用新的Vista样式对话框,多次调用CFileDialog :: DoModal,同一个CFileDialog实例生成ASSERT。
第二次调用DoModal()
下面的行给出 E_UNEXPECTEDHRESULT hr;
hr =(static_cast(m_pIFileDialog)) - > SetFileTypes(nFilterCount,pFilter);
位于文件dlgfile.cpp,位于C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ src \ mfc
可在注释部分的https://msdn.microsoft.com/da-dk/library/dk77e5e7(v=vs.90).aspx找到解释。
可能的解决方案是:
通过更改默认参数bVistaStyle = FALSE
每次创建一个新对话框并将其删除。
如果bVistaStyle = TRUE
,我们不能多次调用DoModal()