调用DoModal总是失败,该怎么解决

调用DoModal总是失败
有什么原因能使domodal总是失败呀?调用ShowWindow(SW_SHOW)也不行,都是执行到这一步就失败了.调试时,到这一个断点:
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));,我不清楚这是什么意思,到底是哪里出错了呀?大大给指点下迷津!谢谢!

------解决方案--------------------
探讨
还是不行,因为theApp.m_pMainWnd不存在,不能投递消息

------解决方案--------------------
正常情况下,将在DoModal()里面的处理的稍后部分,窗口关了以后,就把pThread->m_pMainWnd 置成 NULL。
而你在pThread->m_pMainWnd = NULL。之后,又给它赋值了。

看一下下面的代码吧。

void CWnd::OnNcDestroy()
{
// cleanup main and active windows
CWinThread* pThread = AfxGetThread();
if (pThread != NULL)
{
if (pThread->m_pMainWnd == this)
{
if (!afxContextIsDLL)
{
// shut down current thread if possible
if (pThread != AfxGetApp() || AfxOleCanExitApp())
AfxPostQuitMessage(0);
}
pThread->m_pMainWnd = NULL;
}
if (pThread->m_pActiveWnd == this)
pThread->m_pActiveWnd = NULL;
}
------解决方案--------------------
登陆对话框要在BOOL XXXApp::InitInstance()函数中写,在
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
之前。比如:
Dengludlg dlg2;
if(dlg2.DoModal()==IDOK){
}
else{
return false;
}

------解决方案--------------------
登陆界面为什么一定要在XXXApp::InitInstance()函数中?不能考虑在主窗口的OnInitDialog中调用Domodal()吗
参考代码:
OnInitDialog()
{
// ...
CDlg dlg;
int nRe = dlg.Domodal();
if ( IDCANCEL == nRe )
{
PostMessage(WM_CLOSE, 0, 0); // 密码错误,程序退出
}

//... 登陆验证成功
return TRUE;
}