您的位置:首页 > 其它

BOOL CWnd::DestroyWindow()中出现ASSERT(m_hWnd == hWndOrig)断言的原因及解决方法

2011-10-08 10:59 1051 查看
     当我们在Dll中创建对话框时需要使用AFX_MANAGE_STATE(AfxGetStaticModuleState())语句对资源进行初始化,如果不调用这条语句,DLL中的对话框将无法打开。如果这条语句放在对话框类构造完成后,当调用DoModal()然后退出时就会出现ASSERT(m_hWnd == hWndOrig)断言,原因应该是

if (m_hWnd != NULL)

{
pMap = afxMapHWND();
ENSURE(pMap != NULL);
pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);

#ifdef _DEBUG
hWndOrig = m_hWnd;

#endif
}

这段中pMap->LookupPermanent(m_hWnd);的返回值等于NULL,导致后面的

if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy

#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);

#endif
}
else
{

#ifdef _DEBUG
ASSERT(m_hWnd == hWndOrig);

#endif
// Detach after DestroyWindow called just in case
Detach();
}

中的pWnd==NULL所制。应该是创建的资源不在一个内存空间中。

解决方法: 在每个使用的资源的导出函数开始调用AFX_MANAGE_STATE(AfxGetStaticModuleState())。

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null dll
相关文章推荐