ATL CComPtr复制构造函数

时间:2011-08-29 11:11:59

标签: com

我在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接口对象。

1 个答案:

答案 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;