【问题标题】:Why does CFileDialog::DoModal() Hang?为什么 CFileDialog::DoModal() 挂起?
【发布时间】:2014-07-16 03:35:01
【问题描述】:

我在 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) 时,我重现了与大型项目相同的挂起行为。

谁能解释为什么增加堆栈空间会以这种方式影响文件对话框的执行,有没有办法解决这个问题,记住我需要大的堆栈空间来避免完全重写我的项目?

【问题讨论】:

  • 你的真实项目使用线程吗?
  • 是的,调试多线程 DLL(项目设置)

标签: visual-c++


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2017-10-17
    • 2021-06-09
    • 2012-12-02
    相关资源
    最近更新 更多