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 コピーして使いたいときに気をつけなければならない。
Comments
comments powered by Disqus