转自:http://blog.youkuaiyun.com/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())。