MFC DLL 中调用ADO的Close方法时出现access violation错误

       在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 ExpandedBlockStart.gif Code
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: 

  1. http://topic.csdn.net/t/20050621/11/4096107.html
  2. http://topic.csdn.net/u/20080322/18/af2ff681-3832-4738-8ccf-35a3f8fd1bff.html
  3. http://topic.csdn.net/t/20020327/09/602528.html
  4. http://topic.csdn.net/t/20030721/17/2054300.html
     

转载于:https://www.cnblogs.com/txwsh1/archive/2008/12/08/1349802.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值