为什么CFileDialog :: DoModal()会挂起?

时间:2014-07-08 14:02:30

标签: visual-c++

我在Win XP平台上的VS 6.0中开发了一个相当大的C ++程序,现在已经迁移到运行Win 7的新机器(仍在运行VS 6.0)。该代码包括一个实例化和运行CFileDialog对象的函数,用于查找和打开具有特定初始目录中特定扩展名的ASCII文件。但现在,程序挂起了

if (t1.DoModal()==IDOK)

...其中t1是CFileDialog实例。 为了研究标准CfileDialog类停止工作的原因,我在VS 6.0中创建了一个单独的测试项目,其中包含一个带有一个按钮的简单对话框,其中包含以下代码:

void CFileDialogTestDlg::OnOpenFileDialogButton() 
{
  CFileDialog t1(true);
  if(t1.DoModal()==IDOK)
  {
    CString s3=t1.GetPathName();
    MessageBox(s3);
  }
}

此测试工作正常并显示可用的文件对话框。我还可以通过修改t1的m_ofn成员,在初始目录等方面复制我想要的大型项目。

但是将此代码放入我的大型项目(即修改其中的相关按钮)仍然挂在DoModal()行上。试图追溯到标准的MS类似乎没有效果,内部结构在合理的时间范围内是不可能理解的。

当我为我的测试项目增加堆栈空间以匹配我的大项目(400MB)时,我重现了与大项目相同的挂起行为。

任何人都可以解释为什么增加堆栈空间应该以这种方式影响文件对话框的执行,并且有解决问题的方法,请记住我需要大堆栈空间来避免完全重写我的项目吗?

2 个答案:

答案 0 :(得分:2)

我不确定堆栈是你的问题。已经有一段时间了,但是如果你从错误的线程中访问它们,我似乎还记得常见的模态。

答案 1 :(得分:2)

使用PostMessage() API将命令从任何线程发送到拥有模态对话框的线程。它必须是拥有(和阻塞)线程,最终接收命令以接受/取消对话,以便它从消息泵例程返回。

如果安装Windows调试符号,则可以在调试器中看到阻塞线程的完整调用堆栈。