dll中使用ado的_ConnectionPtr和_RecordsetPtr作为全局变量出错,如何解决

bycreal 2003-10-09 01:02:24
AdoNS::_ConnectionPtr g_pConnection;
AdoNS::_RecordsetPtr g_pRecordset;

在dll的DLL_PROCESS_DETACH中调用如下:

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
g_pAdo=new CAdoPtr;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
if(g_pRecordset!=NULL && g_pRecordset->State)
g_pRecordset->Close();
if(g_pConnection!=NULL && g_pConnection->State)
g_pConnection->Close();

break;
}
return TRUE;
}


在其他exe文件调用此dll时在推出时显示MSDART.DLL错误。请大家指教
...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bycreal 2003-10-13
  • 打赏
  • 举报
回复
谢谢您的回答,我按照您的方法作了。但是还是有问题。
现在的情况是,我生成了_ConnectionPtr的指针,
AdoNS::_ConnectionPtr* g_pConnection;
在dll的DLL_PROCESS_DETACH中调用如下:

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
g_pConnection=new _ConnectionPtr;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
if((*g_pConnection)!=NULL && (*g_pConnection)->State)
(*g_pRecordset)->Close();
if(g_pConnection!=NULL)
delete g_pConnection;
CoUninitialize();

break;
}
return TRUE;
}

在调用delete g_pConnection的时候出错,调试表现为msdart.dll错误。
如果让此dll提供一个接口,此接口中调用delete g_pConnection。并且在其他的exe程序中调用此接口,则没有错误。
现在的问题是:为何在DLL_PROCESS_DETACH和提供接口中的调用的结果不一样。
请大家指教。
bycreal 2003-10-13
  • 打赏
  • 举报
回复
bluebohe(薄荷):
你说的这个问题我知道,现在的问题就在于:如果在dll中声明_ConnectionPtr的全局变量,需要在dll的DLL_PROCESS_DETACH中对其进行析构,而且就是在析构的时候出错。如果这个智能指针变量不是全局的,则没有问题。
另外,在普通的exe文件中的,_ConnectionPtr的全局变量的析构也没有问题。
总之,只要是智能指针不在DLL_PROCESS_DETACH中进行析构,就没有问题。这个我很不理解。
各位同行,哪位知道,请赐教,不胜感谢!

bluebohe 2003-10-13
  • 打赏
  • 举报
回复
智能指针不需要你释放,你最多只要加一个Close就可以了,给g_pConnection赋值为NULL会自动释放的
combojiang 2003-10-10
  • 打赏
  • 举报
回复
结构体的构造函数和析构函数分别为上面的两个函数。
combojiang 2003-10-10
  • 打赏
  • 举报
回复
定义一个全局结构体变量,结构体包含两个函数CoInitialize(NULL);和CoUnInitialize(NULL);

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧