SDI程序中调用DLL中的对话框结果弹出一个断言错来:
wincore.cpp
line:884
继续跟下去在CFrameWnd::AssertValid()中,ASSERT_VALID(m_pViewActive)在这出错了,DLL中还有函数,位图资源,如果不调用DLL中的对话框,则一切正常。请教一下高手这是怎么回事,该如何解决?

解决方案 »

  1.   

    跨线程指针问题
    ASSERT_VALID判断指针的有效性
    m_pViewActive已经到DLL中的对话框
    try SetActiveView 到本线程中或忽略警告(比较危险)
      

  2.   

    就一般的SDI程序,没有添加任何其它文档和视图类型,m_pViewActive怎么会无效??
      

  3.   

    我认为是你的视图窗口没有初始化的原因,或者说你的资源文件不匹配
    你在从DLL中生成对话框时要注意资源HANDLE的设置,记得有人写过一篇文章,专门将这个的,你搜一下
      

  4.   

    http://community.csdn.net/Expert/topic/3296/3296255.xml?temp=.9057123
      

  5.   

    是这样的:
    HINSTANCE hModule = ::LoadLibrary("***.dll");typedef (* PFUNC)();PFUNC pFunc = (PFUNC)::GetProcAddress(hModule, "dllDialog");
    (*pFunc)();FreeLibrary(...);新建SDI/MDI程序添加个菜单响应函数,把上述代码Copy进去,就会出现上述错误但如果是基于Dialog的程序,响应按钮什么的,就不会出错,也就是说错误原因跟视图有关......
      

  6.   

    对了,你的DLL模块加载成功了吗?
      

  7.   

    加载成功,只要不在SDI/MDI中调用DLL中的对话框,其它一切正常。但是在基于Dialog的程序中却没在问题,我想可能是因为他没有视图吧
      

  8.   

    只是随便添加个菜单测试一下,无论把菜单映射在View中还是MainFrame中,都一样出错
      

  9.   

    对话框显示模式?有没有设置PAREHT窗体的要求?
      

  10.   

    常规DLL中的模态对话框,DoModal()-->CDialog::premodal()-->CWnd::GetsafeOwner_()-->CCmdTarget::GetRoutingFrame_()-->.....-->CFrameWnd::AssertValid() consst
    {
      CWnd::AssertValid();              // 这里出错,wincore line:884
      if(m_pViewActive != NULL)
         ASSERT_VALID(m_pViewActive);   // 又出错,wincore line:883,884
    }void CWnd::AssertValid() const
    {
      .......
       ASSERT((p=pMap->LookupPermanent(m_hWnd))!=NULL ||
              (p=pMap->LookupTemporary(m_hWnd))!=NULL );        // line 883
       ASSERT((CWnd *)p == this);                               // line 884
      .......
    }跟踪到这里(CWnd *)p 和this的句柄m_hWnd相同但它们本身值却不同,故导致ASSERT((CWnd *)p == this)抛出错误来
      

  11.   

    -->CFrameWnd::AssertValid() consst
    {
      CWnd::AssertValid();              // 这里出错,wincore line:884
      if(m_pViewActive != NULL)
         ASSERT_VALID(m_pViewActive);   // 又出错,wincore line:883,884
    }void CWnd::AssertValid() const
    {
      .......
       ASSERT((p=pMap->LookupPermanent(m_hWnd))!=NULL ||
              (p=pMap->LookupTemporary(m_hWnd))!=NULL );        // line 883
       ASSERT((CWnd *)p == this);                               // line 884
      .......
    }跟踪到这里(CWnd *)p 和this的m_hWnd相同,但它们本身值却不同,故导致ASSERT((CWnd *)p == this)抛出错误来
      

  12.   

    晕,贴子怎么只发上来一小半??
    继续:-->CFrameWnd::AssertValid() consst
    {
      CWnd::AssertValid();              // 这里出错,wincore line:884
      if(m_pViewActive != NULL)
         ASSERT_VALID(m_pViewActive);   // 又出错,wincore line:883,884
    }void CWnd::AssertValid() const
    {
      .......
       ASSERT((p=pMap->LookupPermanent(m_hWnd))!=NULL ||
              (p=pMap->LookupTemporary(m_hWnd))!=NULL );        // line 883
       ASSERT((CWnd *)p == this);                               // line 884
      .......
    }
    跟踪到这里(CWnd *)p和this的m_hWnd相同,但它们本身值却不同,故导致ASSERT((CWnd *)p == this)抛出错误来
      

  13.   

    佩服佩服,好强!!谢谢jiangsheng(蒋晟.MSMVP2004Jan)!谢谢各位的热心帮忙!