大家看看下边的代码有什么问题?
zzyx 2003-08-07 03:27:40 前些天遇到一个问题,俺试验了很长时间才解决,但还不清楚为什么。
使用一个类CMyADO来封装ADO连接对象,ADO的连接对象使用智能指针
在程序的不同地方,不同线程中来调用CMyADO的 GetConn方法
运行后发现,引用计数总是错的(使用BoundsChecker),多出来许多。
最后,俺把智能指针换成原生指针解决了这个问题。但不知道为什么会这样。
dx们出手看看,俺的代码是否有问题?
实际的使用环境比这个复杂得多,抽象出来代码如下……问题现象依然。
class CMyADO
{
public:
_ConnectionPtr GetConn();
BOOL CloseAndFree();
BOOL Open();
CMyADO();
virtual ~CMyADO();
_ConnectionPtr m_spADOCN;
};
BOOL CMyADO::Open()
{
HRESULT hr;
_bstr_t cn=L"Provider=SQLOLEDB.1;....";
hr=m_spADOCN.CreateInstance (L"ADODB.Connection");
m_spADOCN->Open(cn,"","",adConnectUnspecified);
return true;
}
BOOL CMyADO::CloseAndFree()
{
m_spADOCN->Close;
m_spADOCN.Release ();
return true;
}
_ConnectionPtr CMyADO::GetConn()
{
return m_spADOCN;
}
//****************************************
int test()
{
CMyADO myAdo;
myAdo.Open();
IDispatch* pDisp=NULL;
myAdo.GetConn()->QueryInterface (IID_IDispatch,(void**)&pDisp);
//...
pDisp->Release ();
myAdo.CloseAndFree ();
return 0;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
test();
CoUninitialize();
return 0;
}