SDI程序中调用DLL中的对话框结果弹出一个断言错来:
wincore.cpp
line:884
继续跟下去在CFrameWnd::AssertValid()中,ASSERT_VALID(m_pViewActive)在这出错了,DLL中还有函数,位图资源,如果不调用DLL中的对话框,则一切正常。请教一下高手这是怎么回事,该如何解决?
wincore.cpp
line:884
继续跟下去在CFrameWnd::AssertValid()中,ASSERT_VALID(m_pViewActive)在这出错了,DLL中还有函数,位图资源,如果不调用DLL中的对话框,则一切正常。请教一下高手这是怎么回事,该如何解决?
ASSERT_VALID判断指针的有效性
m_pViewActive已经到DLL中的对话框
try SetActiveView 到本线程中或忽略警告(比较危险)
你在从DLL中生成对话框时要注意资源HANDLE的设置,记得有人写过一篇文章,专门将这个的,你搜一下
HINSTANCE hModule = ::LoadLibrary("***.dll");typedef (* PFUNC)();PFUNC pFunc = (PFUNC)::GetProcAddress(hModule, "dllDialog");
(*pFunc)();FreeLibrary(...);新建SDI/MDI程序添加个菜单响应函数,把上述代码Copy进去,就会出现上述错误但如果是基于Dialog的程序,响应按钮什么的,就不会出错,也就是说错误原因跟视图有关......
{
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)抛出错误来
{
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)抛出错误来
继续:-->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)抛出错误来