我不确定在一个函数中使用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调用有疑问。
他们对你好吗?
提前致谢
答案 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()
和其他函数。