我有一个out-of-proc COM服务器,其中有两个ATL COM对象。object1公开了一个接口,该接口在内部创建object2,并以以下方式返回其接口指针:
HRESULT CObject1::CreateObject2(IObject2** pIobj2)
{
CComObject<Object2>* pObj = NULL;
HRESULT hr = CComObject<Object2>::CreateInstance(&pObj);
hr = pObj->QueryInterface(IID_IObject2,(void**)pIobj2);
//Some reason i need to store this pIobj2
(*pIobj2)->AddRef();
return hr;
}
Object1暴露了另一个接口来移除Object2。
HRESULT CObject1::RemoveObject2(IObject2* pIobj2)
{
pIobj2->Release(); //This to compensate QI done in CreateObject2
pIobj2->Release(); //This to compensate addref done to store in create
}
我的要求是客户端在IObject1::CreateObject2()
之后不得在IObject2
指针上调用Release
。要销毁Object2
,应该调用IObject1::RemoveObject2()
。当我执行客户端时,在RemoveObject2
之后,Object2
并未被销毁,但是当我在客户端上在RemoveObject2
之后调用IObject2
指针的Release
时,Object2
被销毁了。