Date

概要

「COMとは」と書いていくと、それだけで一冊の本になってしまう。ここではDirectShow入門に必要な必要最低限の知識だけ説明する。

COMはComponent Object Modelの略でアプリケーションで使われる様々な機能をコンポーネント化しておき、それを再利用できるようにするための仕組みである。DirectShowコンポーネントを利用したり、コンポーネントそのものを作るにはCOMに従わなければならない。

C++やC#などのオブジェクト指向言語では、ある機能を実装するとき「インターフェイス」と「実装」に分けて考える。機能にアクセスするためのインターフェイスだけを公開し、利用者はその実装の詳細まで意識せずとも機能を利用できる。Visual C++であればインターフェイスはメンバ変数を持たない純粋仮想関数で構成された抽象クラス、または__interfaceで表す。実装はインターフェイスを継承したクラスで表す。以下に例を示す。

```c++ インターフェイス、実装、利用 // __interface __interface IMyInterface { HRESULT MyFunc(); }; // 純粋仮想クラス class IMyInterface { public: virtual HRESULT MyFunc() = 0; }; // 実装 class MyFeature : public IMyInterface { public: HRESULT MyFunc() { / do something / return S_OK; } }; // IMyInterface 利用 * p = new MyFeature; p->Myfunc(); delete p;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
COMそのものは言語非依存な設計であるためC++だけでなくVBJScriptC#からも利用できる。ただしDirectShow、特にフィルタのようなコンポーネントを作る場合、C++で実装するのが現実的な選択となる。(アンマネージなAPI、ライブラリしか存在しない。)

COMに対応した何らかの機能が実装されているクラスをCOMクラスあるいはcoclassと呼ぶ。COMクラスのインスタンス化、解放などについては別記事で述べる。
## 何もしないアプリケーションを作成する

COMアプリケーションはCOMライブラリの初期化と開放が必要である。それを行うだけのアプリケーションを作成する。

### プロジェクトを作成する

[ファイル]-[新規作成]-[プロジェクト]でプロジェクトを作成し、適当な名前をつける。

![Wizard](/img/20070913-com.png)

プロジェクトのプロパティを開き、[構成プロパティ]-[全般]-[文字セット]  [Unicode 文字セットを使用する] にする。Visual Studio 2005/2008では標準の設定になっている。

### コーディング

COMライブラリを初期化するために必ず`::CoInitializeEx`を呼び出す。終了するには`::CoUninitialize`を呼び出す。

```c++ stdafx.h
#define WIN32_LEAN_AND_MEAN
#define _WIN32_DCOM
#pragma warning(disable : 4995)
#pragma comment(lib, "ole32.lib")
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <objbase.h>

c++ _tmain関数 int _tmain(int argc, _TCHAR* argv[]) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); // Note : なんらかの COM 関係の処理をここに記述... CoUninitialize(); return 0; }

https://github.com/mahorigahama/SimpleCOM1


Comments

comments powered by Disqus