问题是这样的,我有一个View,有两个无模式对话框a 和 b,刚刚开始的时候,
View和a,同时出现,然后操作a上面的一个按钮,使b 出现。  但是出现了
Debug assertion failed错误
具体出在wincore.cpp的第628行
ASSERT(pWnd->m_hWnd == NULL);   // only do once我的代码是这样的, 在View里面有两个参数都传给两个对话框。
这两个参数是  View指针,和一个类。
所以对于对话框a来说  构造函数经过修改
CINFODlg::CINFODlg(CMFMView* pView, CMFMDiagnosis* m_MFMModel)
{
         m_pView = pView;
m_Diagnosis = m_MFMModel;
}
通过如下函数创建
BOOL CINFODlg::Create()
{
return CDialog::Create(CINFODlg::IDD);
}对于对话框b同样也是这个办法
//构造函数
CPathshow::CPathshow(CMFMDiagnosis * m_Diagnosis)
{
m_normalFont.CreateFont(12, 0, 0, 0, 400, FALSE, FALSE, 0, 
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "Arial");
m_MFMModel = m_Diagnosis;
}
//create函数
BOOL CPathshow::Create(CMFMView * mView)
{
pView = mView;
return CDialog::Create(CPathshow::IDD);
}在View中生成两个对话框都没有问题代码如下
a
m_pDlg = new CINFODlg(this, &m_pwrDiagnosis);//一个成员
if (m_pDlg->GetSafeHwnd() == 0)
{
m_pDlg->Create();
m_pDlg->ShowWindow(TRUE);
}
b
CPathshow* m_pathDlg = new CPathshow(&m_pwrDiagnosis);//局部变量
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(this);
m_pathDlg->ShowWindow(TRUE);
}但是如果先创建a,然后在a对话框里面创建b就出错,代码是这样子的
void CINFODlg::OnStop() 
{
// TODO: Add your control notification handler code here
m_pView->StopDiagnosis();
GetDlgItem(ID_STOP)->EnableWindow(FALSE);

CPathshow* m_pathDlg = new CPathshow(m_Diagnosis);
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(m_pView);   //在这个地方出错。错误提示见文前
m_pathDlg->ShowWindow(TRUE);
}
}我对p_hWnd不太熟,觉得有点莫名其妙。不但这样出错,我把这个代码写到View里面,然后
用a调用View里面的函数创建也会出错。请问如何搞定。 如果分不够我再加。多谢。

解决方案 »

  1.   

    虽然跟问题无关
    你在CINFODlg::OnStop中每次都new了一个m_pathDlg,却没见在那里delete,建议将CPathshow* m_pathDlg设计成CINFODlg类的成员变量,初始化使new一次,第一次实用的时候Create一次,然后就只用Show或Hide来控制是否可见
      

  2.   

    如果方便的话,发到[email protected]调试一下
      

  3.   

    这个程序是基于一个模拟器的,诊断的时候还需要另外一个程序。而且程序很大。我自己都已经快弄不清楚了,估计不太可行。现在的问题就是在创建第二个对话框的时候,在那个assert出问题,我对p_hWnd不太明白,能否给我讲讲,说不定能搞定。
      

  4.   

    和m_hWnd没有关系。是前面的程序就有问题,才会导致窗口句柄无效的
      

  5.   

    我觉得问题应该出在你b对话框的创建,因为你没有创建成功,所以对话框的m_hwnd 就为空,下面你调用Showwindow的时候,就会触发断言错误,ASSERT(pWnd->m_hWnd == NULL); 建议你检查一下你的b对话框创建的时候是否需要特殊的资源,比如activex控件了,等等,你可以跟踪一下看看构造函数,以及create函数的返回值 ,提供一段无模式对话框创建时的代码,来自msdnpDialog = new CMyDialog();
       //Check if new succeeded and we got a valid pointer to a dialog object
       if(pDialog != NULL)
       {
          BOOL ret = pDialog->Create(IDD_MYDIALOG,this);
          if(!ret)   //Create failed.
             AfxMessageBox("Error creating Dialog");
          pDialog->ShowWindow(SW_SHOW);
       }
       else
          AfxMessageBox("Error Creating Dialog Object");