在MFC DLL 中调用了 封装了ado的数据库操作类MyADO,定义了一个 全局的MyADO类变量。
在DLL测试程序(静态调用)中,每次退出程序时总是报(msdart.dll)0xC0000005:Access violation的异常。 调试时发现执行到ADO的Connection的Close方法时就会出现上述错误。 注:COM已初始化
可能是Close方法写在MyADO类的析构函数中,而在DLL中的MyADO类变量是全局的,可能在关闭程序时先调用CoUninitialize,再调用其析构函数因COM环境已释放而出现内存访问出错。
经过一番搜索,想到解决方法是:
M1:在 MyADO类中新增方法 Destroy、把Connection的Close方法写此方法中,然后再在MFC DLL的App类的ExitInstance()方法中调用MyADO类的Destroy() 方法.这样就OK了。 (MFC DLL 是有App类的)
M2:定义成App类的成员变量
对于非基于MFC 的Win32 DLL工程, 把MyADO类变量定义指针,MyADO * myDB; 在 DllMain函数中处理。
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
//此处清理myDB变量,调用MyADO类析构函数
delete myDB;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Reference: