释放 MFC Ext DLL @ dllmodul.cpp 时的断言错误 #230

Posted

技术标签:

【中文标题】释放 MFC Ext DLL @ dllmodul.cpp 时的断言错误 #230【英文标题】:Assertion Error when Release the MFC Ext DLL @ dllmodul.cpp #230 【发布时间】:2011-07-13 04:13:56 【问题描述】:

我编写了一个MFC Extension DLL,输入并使用导出的Function就可以了;

但是当我退出应用程序时,在 DLL 释放 DLL 的过程中,它抛出了一个断言错误,然后我跟踪错误,发现它停在这个:

extern "C"
BOOL WINAPI RawDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)

     hInstance;
     if (dwReason == DLL_PROCESS_ATTACH)
     
#ifdef _AFXDLL
// make sure we have enough memory to attempt to start (8kb)
          void* pMinHeap = LocalAlloc(NONZEROLPTR, 0x2000);
          if (pMinHeap == NULL)
               return FALSE; // fail if memory alloc fails
          LocalFree(pMinHeap);

          // set module state before initialization
          _AFX_THREAD_STATE* pState = AfxGetThreadState();
          pState->m_pPrevModuleState = AfxSetModuleState(&afxModuleState);
     
     else if (dwReason == DLL_PROCESS_DETACH && !__mixedModuleStartup)
     
          // restore module state after cleanup
          _AFX_THREAD_STATE* pState = AfxGetThreadState();

          // ************************************************
          VERIFY(AfxSetModuleState(pState->m_pPrevModuleState) ==
          &afxModuleState); // Where Error occurred 
          // ************************************************

          DEBUG_ONLY(pState->m_pPrevModuleState = NULL);

#endif //_AFXDLL
     
     return TRUE;

【问题讨论】:

【参考方案1】:

您未能在 DLL 的所有入口点上正确使用 AFX_MANAGE_STATE。所以你的模块状态是错误的,因此断言。

马丁

【讨论】:

不过我用的是MFC Ext DLL,我记得AFX_MANAGE_STATE只在MFC Reg DLL中有用。 AFX_MANAGE 状态也需要您从 MFC 世界外部越过边界进入它。断言是在告诉您,您的状态以某种方式管理不善。

以上是关于释放 MFC Ext DLL @ dllmodul.cpp 时的断言错误 #230的主要内容,如果未能解决你的问题,请参考以下文章

MFC —— 资源文件释放(为了程序更简洁)

MFC误报内存泄露的修复

MFC误报内存泄露的修复

远程线程DLL注入, 如何释放DLL和结束DLL的线程

VC6的MFC如何调用C#的tlb文件

血本急求:将对话框放入 DLL 文件当中,在主程序中作为子窗口非模态显示,做完操作后,释放该 DLL 的方法