Visual c++ 如何在CWinApp::ExitInstance()上打开模式对话框

Visual c++ 如何在CWinApp::ExitInstance()上打开模式对话框,visual-c++,mfc,Visual C++,Mfc,我想在执行现有清理时显示一个模式对话框,然后在清理完成后终止对话框。 下面是我的示例代码,从中我从VisualStudioMFC项目模板创建了一个示例应用程序 int CMFCApplication2App::ExitInstance() { #if 1 CDialog dlg(IDD_UPLOADDLG); dlg.DoModal(); #endif return CWinApp::ExitInstance(); } 我收到下面的错误提示消息 好的,如果在调试器中单击“重试”,

我想在执行现有清理时显示一个模式对话框,然后在清理完成后终止对话框。 下面是我的示例代码,从中我从VisualStudioMFC项目模板创建了一个示例应用程序

int CMFCApplication2App::ExitInstance()
{
#if 1
  CDialog dlg(IDD_UPLOADDLG);
  dlg.DoModal();
#endif

  return CWinApp::ExitInstance();
}
我收到下面的错误提示消息


好的,如果在调试器中单击“重试”,它会将您带到有问题的行。我在编辑器中打开了thrdcore.cpp,然后转到第168行。有关在不允许时调用PumpMessage的常规消息

从thrdcore.cpp:

BOOL AFXAPI AfxInternalPumpMessage()
{
    _AFX_THREAD_STATE *pState = AfxGetThreadState();

    if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
    {
#ifdef _DEBUG
        TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n");
            pState->m_nDisablePumpCount++; // application must die
#endif
        // Note: prevents calling message loop things in 'ExitInstance'
        // will never be decremented
        return FALSE;
    }

#ifdef _DEBUG
  if (pState->m_nDisablePumpCount != 0)
    {
      TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage called when not permitted.\n");
      ASSERT(FALSE);
    }
#endif

#ifdef _DEBUG
    _AfxTraceMsg(_T("PumpMessage"), &(pState->m_msgCur));
#endif

  // process this message

    if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur)))
    {
        ::TranslateMessage(&(pState->m_msgCur));
        ::DispatchMessage(&(pState->m_msgCur));
    }
  return TRUE;
}
它告诉您不要显示模式对话框或在存在期间执行任何其他调用PumpMessage的操作。当接收到WM_QUIT时,它会增加m_nDisablePumpCount,然后程序开始关闭,最终调用ExistInstance


相反,不要显示此对话框。老实说,这没有目的。模态对话框将当场阻塞。如果您想在关机时显示有用的窗口/提示,请针对框架窗口的WM_CLOSE消息执行此操作。

好的,如果您在调试器中单击“重试”,它会将您带到有问题的行。我在编辑器中打开了thrdcore.cpp,然后转到第168行。有关在不允许时调用PumpMessage的常规消息

从thrdcore.cpp:

BOOL AFXAPI AfxInternalPumpMessage()
{
    _AFX_THREAD_STATE *pState = AfxGetThreadState();

    if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
    {
#ifdef _DEBUG
        TRACE(traceAppMsg, 1, "CWinThread::PumpMessage - Received WM_QUIT.\n");
            pState->m_nDisablePumpCount++; // application must die
#endif
        // Note: prevents calling message loop things in 'ExitInstance'
        // will never be decremented
        return FALSE;
    }

#ifdef _DEBUG
  if (pState->m_nDisablePumpCount != 0)
    {
      TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage called when not permitted.\n");
      ASSERT(FALSE);
    }
#endif

#ifdef _DEBUG
    _AfxTraceMsg(_T("PumpMessage"), &(pState->m_msgCur));
#endif

  // process this message

    if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur)))
    {
        ::TranslateMessage(&(pState->m_msgCur));
        ::DispatchMessage(&(pState->m_msgCur));
    }
  return TRUE;
}
它告诉您不要显示模式对话框或在存在期间执行任何其他调用PumpMessage的操作。当接收到WM_QUIT时,它会增加m_nDisablePumpCount,然后程序开始关闭,最终调用ExistInstance


相反,不要显示此对话框。老实说,这没有目的。模态对话框将当场阻塞。如果希望在关闭时显示有用的窗口/提示,请执行框架窗口的WMYCalk消息。< /P>编辑删除C++和模态对话框标签。这不是一个C++问题,它会让C++论坛上的人感到恼火,并导致你的问题被否决。你可以看到我给你的答案。我不太确定,但我认为MFC已经做了太多的内部清理。对话应该做什么?可能有更好的位置显示此对话框。它是基于对话框的应用程序吗?你需要告诉我们更多,这样我们才能提供进一步的建议。这看起来像是一个典型的选项,除了@JosephWillcoxson解释的无效选项外,这也是无用的:您的程序将阻塞,直到该对话框被取消,并且不会进行清理。@Jabberwocky我想阻止应用程序在等待上传文件完成时退出。我正在考虑在模式对话框中显示一个进度条,这样它就不会继续退出应用程序。是的,它是一个基于对话框的应用程序。@ MARSS,这绝对是你应该做的。我编辑了删除C++和模态对话框标签。这不是一个C++问题,它会让C++论坛上的人感到恼火,并导致你的问题被否决。你可以看到我给你的答案。我不太确定,但我认为MFC已经做了太多的内部清理。对话应该做什么?可能有更好的位置显示此对话框。它是基于对话框的应用程序吗?你需要告诉我们更多,这样我们才能提供进一步的建议。这看起来像是一个典型的选项,除了@JosephWillcoxson解释的无效选项外,这也是无用的:您的程序将阻塞,直到该对话框被取消,并且不会进行清理。@Jabberwocky我想阻止应用程序在等待上传文件完成时退出。我正在考虑在模式对话框中显示一个进度条,这样它就不会继续退出应用程序。是的,这是一个基于对话框的应用程序。@Marss这绝对是你应该做的。谢谢你的回复。当我在模态对话框类中执行某些操作时,我阻止应用程序退出。我可以在模态对话框类中进行清理。异常提示只出现在调试配置上,但发布配置可以。@mar别自欺欺人。发布配置不好。它只是没有将诊断代码编译到可执行文件中,因此当您试图进入不受支持的应用程序状态时,它保持沉默。错误仍然存在,您应该帮自己一个忙并修复它。感谢您的回复。当我在模态对话框类中执行某些操作时,我阻止应用程序退出。我可以在模态对话框类中进行清理。异常提示只出现在调试配置上,但发布配置可以。@mar别自欺欺人。发布配置不好。它只是没有将诊断代码编译到可执行文件中,因此当您试图进入不受支持的应用程序状态时,它保持沉默。错误仍然存在,您应该帮自己一个忙并修复它。