描述:
下面代码是调用别人的COM,但是我退出时,却出了这个问题,
CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
if (m_xDispatch.m_vtbl != 0)
((COleDispatchImpl*)&m_xDispatch)->Disconnect();
ASSERT(m_dwRef <= 1);//断言!!!!
#endif
#ifdef _AFXDLL
m_pModuleState = NULL;
#endif
}
请问达人,是我调用的问题,还是COM编写的问题,调用代码如下:
In_ecardPtr pECard;
hr = ::CoCreateInstance(
CLSID_COClass_n_ecard,
NULL,
CLSCTX_INPROC_SERVER,
IID_In_ecard,// 不再经过 IUnknown, 直接得到 IFun 接口指针
(LPVOID *) &pECard);
if( FAILED( hr ) )
return ;
if( pECard )
pECard.Release();
解决方案1:
你用的是智能指针包装类?
hr = ::CoCreateInstance(
CLSID_COClass_n_ecard,
NULL,
CLSCTX_INPROC_SERVER,
IID_In_ecard,// 不再经过 IUnknown, 直接得到 IFun 接口指针
(LPVOID *) &pECard);
改成
HRESULT hr = pECard.CreateInstance( __uuidof(In_ecard) );
if (SUCCEEDED(hr))
{
// 卸载COM服务.
CoFreeUnusedLibraries();
}
你加上这个实验一下
单步跟踪检查一下引用计数
有可能你addref之后忘记release了
你可以在实例化对象之后,调用该对象的一个其他方法,再release()
直接创建,然后就退出,好像有这样的问题
pECard->Release();