【问题标题】:MFC App closes on startupMFC 应用程序在启动时关闭
【发布时间】: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;
}

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

【问题讨论】:

    标签: c++ visual-c++ mfc


    【解决方案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 我更新了我的答案。无需创建消息循环!
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2012-04-30
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多