Date

概要

COMクラスのインスタンスの作成

COMクラスのインスタンスを生成するにはCoCreateInstanceを使う。

1
2
3
4
5
6
7
8
// from objbase.h
WINOLEAPI CoCreateInstance(
REFCLSID rclsid,  // (1)
LPUNKNOWN pUnkOuter, // (2)
DWORD dwClsContext,  // (3)
REFIID riid, // (4)
LPVOID FAR* ppv // (5)
);

DirectShowアプリケーションにおいて大切なのは rclsid, riid, ppv の3つの引数である。

(1) rclsid IN クラスID(CLSID)を指定する。
(4) riid IN インターフェイスID(IID)を指定する。
(5) ppv OUT 作成したインスタンスへのポインタ。

COMクラスには一つ一つクラスIDが割り当てられている。対応するクラスIDと、実装されているDLLのペアがレジストリに登録されており、それがロードされる仕組み。

インターフェイスIDは、COMクラスが実装しているインターフェイスのIDを指定する。COMクラスは一つのインターフェイスを実装しているわけではない。

使い方の例を示す。

1
2
3
4
5
6
7
8
IGraphBuilder *pGraphBuilder = NULL;
CoCreateInstance(
    CLSID_FilterGraph
    , NULL
    , CLSCTX_INPROC_SERVER
    , IID_IGraphBuilder
    , (void **)&pGraphBuilder
);

インスタンスの解放

インスタンスを解放するにはIUnknown::Releaseである。COMインターフェイスは必ずIUnknownインターフェイスが継承されている。

1
pGraphBuilder->Release();

インターフェイスの問い合わせ

インスタンス作成時に取得したインターフェイスから別のインターフェイスを取得できる。C++のdynamic_castのCOM実装のイメージ。

インターフェイスを取得するにはIUnknown::QueryInterfaceを呼ぶ。

riid IN インターフェイスID(IID)を指定する。
ppv OUT 作成したインスタンスへのポインタ。

試しにIGraphBuilderインターフェイスからIMediaControlインターフェイスを取得してみる。

1
2
IMediaControl *pMediaControl = NULL;
pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);

インターフェイスを取得した場合、IUnknown::Releaseで解放しなければならない。

1
pMediaControl->Release();

https://github.com/mahorigahama/SimpleCOM2


Comments

comments powered by Disqus