1

具有以下功能:

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

如何调用它,以便通过引用传递 pMediaType 并保留对方法中的对象所做的一切?

4

2 回答 2

5

因为您将对象作为指针提供给函数,所以在方法中对对象所做的一切都会被保留。

您可以通过以下方式调用它:

CMediaType pMediaType;
GetMediaType( 0, &pMediaType );
于 2014-03-05T14:25:12.510 回答
0

正如您目前拥有的那样:

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

在这样的代码中:

CMediaType mediaType;
...GetMediaType(position, &mediaType);

您在bodypMediaType内部所做的任何事情都会在调用站点“保留”,因为您将指针传递给.GetMediaType()mediaType

但是,如果您想创建CMediaType内部GetMediaType()主体的新实例,并将其作为输出指针值返回,调用者在使用后必须以某种方式释放(有点像 COM IUnknown::QueryInterface()),那么您可以使用双间接指针,例如

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType** ppMediaType    // [OUT] Created by the method, must be freed by the caller
);

使用示例:

CMediaType* pMediaType = nullptr;
...GetMediaType(iPosition, &pMediaType);

... use pMediaType ...
...
... somehow release pMediaType

无论如何,尝试应用 KISS 规则,使代码尽可能简单(因此,如果可以,请避免使用双间接指针)。

于 2014-03-05T15:05:08.720 回答