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 应用程序在启动时关闭的主要内容,如果未能解决你的问题,请参考以下文章