我在COM服务器上使用简单对象构造函数:
CComPtr<IObj> obj; //member
hr = SUCCEDDED(hr) ? this->obj.CoCreateInstance(__uuidof(CObj)) : hr;
STDMETHODIMP CConfig::get_Obj(IObj ** pVal)
{
if (pVal == nullptr)
{
return E_POINTER;
}
CComPtr<IObj> result(this->obj);
*pVal = result.Detach();
return S_OK;
}
我想要实现的是get_Obj()方法在成功调用时返回相同的接口对象。查看代码CComPtr似乎增加引用计数。之后我也从CComPtr分离出来。 这是实现我想要的正确方法吗?我不希望每次调用方法get_Obj()时都强制COM客户端“处置”IObj接口对象。
答案 0 :(得分:1)
是的,您可以用最清晰的方式实现它。您必须将最后返回的值存储在某处 - 例如在CConfig
中作为成员变量。除此之外,您无法提供干净的onwership语义 - 客户端期望返回的指针为AddRef()
(如在您的代码中)是正常的,并且客户端将释放对象所有权是正常的。如果要返回相同的对象,则必须在某处存储额外的指针,并且指针也必须拥有该对象(至少调用AddRef()
一次)。
所以你的代码做得对 - 它复制了一个存储的指针并执行AddRef()
。你也可以没有CComPtr
:
if (pVal == nullptr) {
return E_POINTER;
}
*pVal = this->obj;
if( this->obj != 0 ) {
this->obj->AddRef();
}
return S_OK;