2017-12-01 2 views
-1

私は、Windows APIから少なくとも1つのCOMインターフェイスを消費するC++クラスを作成しています。明らかに、クラス内でこれらのオブジェクトを消費するときは、AddRef()Release()を正しく呼び出す必要があります。クラスでIUnknownを実装する場合

私の質問は... IUnknownをC++クラス自体に追加実装する必要がありますか?私が使用していたインターフェイスが非同期操作またはコールバックを実行していた場合は、これを行うだけで済みます。その場合は、非同期操作またはコールバックが完了したときにC++クラス自体が "生きている"ことを確認する必要があります。これは正しいです?

私が興味を持っている具体的なインターフェイスは、IMFSourceReader(Windows Media Foundation)です。このインタフェースのデフォルトは同期モードです。これを正しく理解すれば、非同期モードで使用する代わりにIUnknownをC++クラスに実装する必要があります。それ以外の場合は、IMFSourceReader->AddRef()またはIMFSourceReader->Releaseへのコールで十分です。

ただし、IMFSourceReaderを非同期モードで使用する場合は、IMFSourceReaderCallbackインターフェイスが必要です。それ自体はIUnknownを継承します。その場合、私はクラスで実装する必要があります。

私の理解は正しいですか?私は実装の初期段階にありますので、共有するサンプルコードは実際にはありません。この時点で、私はクラスの非常に基本的な構造を打ち破ろうとしています。

+0

[IUnknownのしくみ](https://msdn.microsoft.com/en-us/library/windows/desktop/dd388915(v=vs.85).aspx)は既に読んでいますか? – user0042

+2

Windowsで実装されているCOMインターフェイスの場合は、あいまいな質問をする必要はありません。あなたがやろうとしていることを示して、マニュアルを尋ねないでください。 –

+0

ヒント: 'AddRef()'と 'Release()'呼び出しを適切に行うためには、ラッパークラスのようなスマートポインタを実装することをお勧めします([here](http://loki-lib.sourceforge.net/html /a00045.html)参照)。 – user0042

答えて

3

COMオブジェクトを実装するのであれば、IUnknownを実装するだけで、COMを使用するだけでIUnknownを実装する必要はありません。

+0

ありがとう!これはまさに私が探していたものでした。私はそれが事実だと思ったが、私のCOMの研究は未だに初期段階なので、私は確信したかった。 –

+0

これに追加するだけで消費しているCOMオブジェクトもイベント(IConnectionPointContainer経由など)を公開していて、イベントシンクでそれらのイベントを購読したい場合は、COMオブジェクト(イベントシンク)を強制的に実装することになります。そうするために – Joe

関連する問題