如何将CComPtr作为类的成员变量进行破坏?

时间:2015-03-20 10:33:43

标签: c++ com atl

如何将CComPtr作为类的成员变量进行破坏?

以下是我编写的代码片段,m_piControl是成员变量CComPtr。 我已将m_piControl的值分配给rpControl,并进一步使用了rpControl。

HRESULT CSession::GetInterface(OUT CComPtr<IControl>&   rpControl )
{
    if (m_piConSIControl == NULL)
    {
        CComPtr<IDispatch> pConDM;
        HRESULT hResult = GetMaintenance( &pConDM );
        if( FAILED( hResult ) )
            return hResult;

        CComQIPtr<IMaintenance> pMaintenance( pConDM );
        if( !pMaintenance )
            return E_NOINTERFACE;

        hResult = pMaintenance->GetControl( &m_piControl );
        if( FAILED( hResult ) )
            return hResult;
    }
    rpControl = m_piControl;
    return S_OK;
}

在分配时,m_piControl引用计数增加。但m_piControl的发布没有被调用。 我应该明确地打电话吗?

1 个答案:

答案 0 :(得分:1)

当[member]变量被销毁时,将发生m_piControl的COM接口指针,这反过来会破坏所有者类实例。这确实发生了#34;自动&#34;并且正确管理引用计数。也就是说,您不需要明确释放m_piControl的值。

如果由于某种原因仍然希望明确释放接口指针,您可以随时(假设您遵守COM线程)调用m_piControl.Release();。例如,在您的代码段中返回S_OK之前可能会发生这种情况。