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 に答える