COM (技術)
読み:コム
外語:COM: Component Object Model
Microsoft
の提唱する分散
コンポーネント
技術(分散部品化技術)のことで、複数のソフトウェア間で情報や機能を交換しあうことができる。
目次
概要
特徴
C++
使用例
技術
アパートメント
インスタンスの作成
概要
近年のWindows APIは、COMベースで実装されることが多い。
これは、COMは特定のプログラミング言語に依存しないオブジェクトの提供とアクセス方法を規定しているためであり、様々なプログラミング言語が使われるWindowsにおいては、Cを前提とした従来型のAPIより、COMの方が都合が良いためと思われる。
例えば、Windows Shell APIなどはCOMベースで実装されており、シェルを使ったプログラムを書く場合には、COMの知識が不可欠となる。
またCOMは、サーバー側とクライアント側に別れる。COM オブジェクトを提供するサーバー側は一般に「COM サーバー」や「COM コンポーネント」と呼ばれ、クライアント側は「COM クライアント」と呼ばれる。
特徴
C++
Visual C++
では、Co から始まる関数群が、COMのAPIとして提供されている。
このAPIは
スレッドセーフ
となっており、スレッドごとに独自に処理できる。
使用例
COMを用いたプログラミングについては、Microsoftのサイトにて公開されている。
MFCなどを使わず、純なWin32アプリの作り方としては、[連載! とことん VC++] が非常に参考になる。
#1 COMクライアント
#2 COMサーバー
#3 ジャンプ リスト
技術
アパートメント
COMの実行環境をアパートメントと呼び、COMを使うためにはまずアパートメントを作る必要がある。
アパートメントには、「STA(Single Thread Apartment)」と「MTA(Multi Thread Apartment)」の二種類がある。旧来はSTAのみだったが、後から(恐らく
Windows NT 4.0
の頃から)MTAが追加された。
STAのアパートメントは以下のどちらかで作ることができる。
HRESULT hres = ::CoInitialize(NULL);
HRESULT hres = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
MTAのアパートメントは以下のようにして作ることができる。
HRESULT hres = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
STAの場合、オブジェクトがシングルスレッドで実行されることをシステムが保証する。従って、スレッドセーフを想定した実装にせずとも、安全に動作できる。
MTAの場合、
マルチスレッド
が利用可能だが、その代わりプログラム側でスレッドセーフになるよう記述する必要がある。
インスタンスの作成
C++では、CoCreateInstance 関数を用いて
インスタンス
を作る。
インスタンスを作る際には、クラスを識別するためのユニークな値としてクラス ID(CLSID)を使う。これは、128ビット長のGUIDである。
これは必ずしも世界で唯一として管理される必要はなく、特定のCOMクライアントが参照できる範囲内で重複がなければ良い。この需要を充分に満たせるものとしてGUIDが使われており、MicrosoftのGUID生成ツールguidgen.exe などが使われる。
結果として、特定のCOMオブジェクトを使うためには、そのCLSIDを知る必要がある。
再検索