双指针函数参数和CComPtr

时间:2011-11-07 16:10:08

标签: c++ atl smart-pointers

我不确定在一个函数中使用CComPtr的方法,该函数有一个表示为双指针的参数:

HRESULT D3DPresentEngine::CreateD3DSample(
    IDirect3DSwapChain9 *pSwapChain, 
    IMFSample **ppVideoSample
    )
{
    // Caller holds the object lock.

    D3DCOLOR clrBlack = D3DCOLOR_ARGB(0xFF, 0x00, 0x00, 0x00);

    CComPtr< IDirect3DSurface9 > pSurface;
    CComPtr< IMFSample > pSample;

    // Get the back buffer surface.
    ReturnIfFail( pSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface ) );

    // Fill it with black.
    ReturnIfFail( m_pDevice->ColorFill(pSurface, NULL, clrBlack));

    // Create the sample.
    ReturnIfFail( MFCreateVideoSampleFromSurface(pSurface, &pSample));

    // Return the pointer to the caller.
    *ppVideoSample = pSample;
    (*ppVideoSample)->AddRef();

    return S_OK;
}

我对最后一次分配+ AddRef调用有疑问。

他们对你好吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

没关系,但可以简化:

HRESULT D3DPresentEngine::CreateD3DSample(
    IDirect3DSwapChain9 *pSwapChain, 
    IMFSample **ppVideoSample
    )
{
    // Caller holds the object lock.

    D3DCOLOR clrBlack = D3DCOLOR_ARGB(0xFF, 0x00, 0x00, 0x00);

    CComPtr< IDirect3DSurface9 > pSurface;

    // Get the back buffer surface.
    ReturnIfFail( pSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface ) );

    // Fill it with black.
    ReturnIfFail( m_pDevice->ColorFill(pSurface, NULL, clrBlack));

    // Create the sample.
    ReturnIfFail( MFCreateVideoSampleFromSurface(pSurface, ppVideoSample));

    return S_OK;
}

在您的代码中,AddRef是必要的,因为当pSample超出范围时Release将{{1}}。

答案 1 :(得分:3)

更惯用的版本是

// Transfer the pointer to our caller.
*ppVideoSample = pSample.Detach();

如果您想要复制语义而不是传输,则可以使用

pSample.CopyTo(ppVideoSample);

答案 2 :(得分:0)

AddRef()的分配和解除引用是正确的。

当调用MFCreateVideoSampleFromSurface()时,它的第二个参数是应该存储指向接口的指针的位置。您使用&pSample获取要传递给函数的地址。这符合所需的IMFSample **类型。请注意,&上的CComPtr<>运算符通过CComPtrBase<>返回正确的类型。

CComPtrBase::& operator @ MSDN

ppVideoSample也是类型IMFSample **,需要*运算符取消引用接口指针。这会生成一个IMFSample *类型的指针,您可以使用->运算符调用该指针来访问接口上的AddRef()和其他函数。