您的位置:首页 > 其它

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

2013-09-22 20:31 651 查看
转自:http://blog.csdn.net/ningbinzhang/article/details/6851766 

 当我们在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())。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐