Date

ATLにはCOMのスマートポインタのテンプレートクラスCComPtrが含まれている。

インターフェイスの宣言

RAWなCOMではCOMインターフェイスへのポインタは、次のように宣言していた。

1
IGraphBuilder *pGraphBuilder;

CComPtrテンプレートクラスを使うときは次のように宣言する。

1
CComPtr<IGraphBuilder> graph_builder;

インスタンス作成は以下。

1
graph_builder.CoCreateInstance(CLSID_FilterGraph);

あとは普段通りメソッドを呼ぶことができる。デストラクタで自動的にReleaseが呼ばれるので解放し忘れがない。

インターフェイスを問い合わせるにはQueryInterfaceテンプレートメソッドを呼び出す。

1
2
CComPtr<IMediaControl> media_control;
graph_builder.QueryInterface<IMediaControl>(&media_control);

グローバル変数の注意

デストラクタでReleaseが呼ばれるので、グローバル変数にはできない。例えば、次のようにした場合CoUninitializeが呼ばれた後にデストラクタが呼ばれてしまう。

1
2
3
4
5
6
7
8
CComPtr<IGraphBuilder> graph_builder; // variable as global
int _tmain(int argc, _TCHAR* argv[])
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    // ...
    CoUninitialize();
    return 0;
}

SDKのサンプルにはグローバル変数でインターフェイスを持たせているものもあるので、ATLに移植 or コピーして使いたいときに気をつけなければならない。

https://github.com/mahorigahama/simpleCOM3


Comments

comments powered by Disqus