MFC 应用程序在启动时关闭

Posted

技术标签:

【中文标题】MFC 应用程序在启动时关闭【英文标题】:MFC App closes on startup 【发布时间】:2014-06-20 09:39:21 【问题描述】:

尝试运行一个简单的 MFC 应用程序但由于程序终止而关闭,假设我需要在单独的线程中运行该对话框但不知道如何。

这是目前为止的代码:

CWinApp theApp;

using namespace std;

int main(int argc, TCHAR* argv[], TCHAR* envp[])

    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    theApp.InitApplication();
    theApp.InitInstance();
    theApp.Run();

    AfxWinTerm();

    if (hModule != NULL)
    
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;

        
        else
        
            MyDialog *mdlg = new MyDialog();
            mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
            mdlg->ShowWindow( true );

        
    
    else
    
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    

    return nRetCode;

我必须做一些简单的事情来防止程序终止,只是不确定如何?

【问题讨论】:

【参考方案1】:

而不是调用:

mdlg->ShowWindow( true );

你应该这样做:

mdlg->DoModal();

另外,我认为你不需要Create。如果你想继续使用无模式对话框,那么你应该在从 main 返回之前创建消息循环 - 就像这里 http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

【讨论】:

正在查看,但我的类(从 CDialog 继承)没有成员“DoModel”? 如果是 MFC CDialog 那么它肯定有 DoModal(通过继承):msdn.microsoft.com/pl-pl/library/619z63f5.aspx 是的,我是个白痴,我得到一个调试断言失败:// 不能在已经构造为无模式 ASSERT(m_hWnd == NULL)的对话框上调用 DoModal; 摆脱了创建,但消息泵断言失败:TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage called when not allowed.\n");断言(错误); 终于搞定了;使用你的***链接并在执行 Create() 和 ShowWindow() 后调用 WinMain;【参考方案2】:

据我所知,您创建了一个 Win32 控制台应用程序并尝试向其添加 GUI?只有当你真的需要控制台时,你才应该这样做。如果没有,那么最好创建一个新项目,选择 MFC 应用程序模板并选择基于对话框的应用程序。该向导将创建您需要的所有内容。

顺便说一句,你的

MyDialog *mdlg = new MyDialog();
mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
mdlg->ShowWindow( true );

最好是:

MyDialog mdlg;
mdlg.DoModal();

在你的情况下不需要new,所以只需在堆栈上分配对象。 DoModal 做你想做的事。

在我的支持 MFC 的 Win32 控制台应用程序中,我能够显示一个对话框。但在我的向导生成的代码中,这些行不存在,所以也许你应该删除它们:

theApp.InitApplication();
theApp.InitInstance();
theApp.Run();

AfxWinTerm();

【讨论】:

是的,这就是我想要的,知道为什么会出现这种情况:TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage call when not allowed.\n");断言(错误); ? @user3047190 该消息什么时候来?您是重新创建项目还是这仍然是控制台应用程序?什么时候出现错误? 谢谢,使用已接受答案中的 wiki 链接解决了这个问题,我知道问题与消息抽取有关,因此 wiki 链接允许我创建一个消息循环以在对话框按钮之间传递消息和程序 - 并通过扩展保持程序打开 @user3047190 我更新了我的答案。无需创建消息循环!

以上是关于MFC 应用程序在启动时关闭的主要内容,如果未能解决你的问题,请参考以下文章

MFC中如何关闭ShellExecute调用的外部执行程序?

添加列表控件元素时MFC应用程序卡住[关闭]

是啥导致 MFC 应用程序菜单栏变灰? [关闭]

创建线程会在终止时挂起 MFC 对话框应用程序

模态 CDialog 找不到资源 (MFC)

如何在 MFC 应用程序首次启动时禁用自动文档/视图创建