Component Object Model
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Component Object Model(COM、コンポーネント・オブジェクト・モデル)とは、マイクロソフト が提唱するソフトウェアの再利用を目的とした技術のことである。ソフトウェア間での通信に用いられ、主としてMicrosoft Windows上で使用されるが、UNIXやMac OSでも使用することができる。
COMを使用して開発されたソフトウェアをCOMコンポーネントと呼ぶ。COMコンポーネントは、特定の開発言語に依存せず、C言語やJavaなど、様々な言語により開発を行うことができる。COMコンポーネントは、他ソフトウェアと通信するためのインタフェースを有している。アプリケーションは、公開されているインターフェースを介してCOMコンポーネントと通信をし、それらを組み合わせることでサービスを提供する。
COMの前身はOLEであり、COMはやがて.NET Frameworkへ継承された。
目次 |
[編集] COMの歴史
- 1991年、COMの前身であるOLEが、OLE 1としてWindows 3.1とともに公開され、1992年にはOLE 2が公開された。
- 1994年、OCXもしくはOLEコントロールがVBXコントロールの後継として紹介される。それと同時に、OLEは、もはや単なる頭文字ではなく、コンポーネント技術を表す用語となった。
- 1996年初頭、マイクロソフトは、OLEのうちでインターネットと関連のあるいくつかの技術をActiveXとして名称変更した。やがて、OLEとして公開されていた技術がActiveXに統合され始める。
- 1997年、マイクロソフトは再びコンポーネントを使用するこれらの技術の変名を行い、Component Object Modelとした。
[編集] 技術的詳細
COMコンポーネントにはクラスID(CLSID)が割り当てられ、COMコンポーネント同士はクラスIDによって区別される。CLSIDはGUIDで構成されている。各COMコンポーネントは1つ以上のインタフェースを公開することで機能を提供している。インタフェース同士はインタフェースID(IID)で区別される。IIDもGUIDで構成されている。
COMインタフェイスはプログラミング言語とCOMとを結び付けている。COMコンポーネントへのアクセスは全てインタフェースを通さなければならない。これによって、プロセスやコンピュータを跨いでCOMコンポーネントへアクセスすることができるようになっている(後者はDCOMが必要)。
[編集] インタフェース
全てのCOMコンポーネントはIUnknownインタフェースを継承する必要がある。つまり全てのCOMインタフェースはIUnknownから派生しているのである。IUnknownは、AddRef/Release/QueryInterfaceという3つのメソッドを持っている。AddRefとReleaseはインタフェースの生存期間を管理するための参照カウントを実装するメソッドである。そしてQueryInterfaceは、IIDを指定してコンポーネントが実装している他のインターフェイスを取得するメソッドである。これはC++のdynamic_castやJavaやC#の型変換演算子に相当する。
COMコンポーネントのインタフェースは、反射性、対称性、推移性を備えている必要がある。反射性とは、あるインタフェースから、QueryInterfaceをそのインタフェース自身を表すIIDを与えて呼び出すと、返ってくるインタフェースは元と同じものでなければならないということである。対称性とは、インタフェースAからQueryInterfaceでインタフェースBが取得できる場合、インタフェースBからインタフェースAが取得できなければならないということである。推移性とは、対象性と似ているが、インタフェースBがインタフェースAから取得でき、インタフェースCがインタフェースBから取得できる場合、インタフェースCはインタフェースAから取得できなければならないということである。
インタフェースには、インタフェースを実装した関数へのポインタをその宣言時の順に並べた仮想関数テーブルへのポインタが含まれている。この関数へのポインタを並べた構造は、OLE 1.0のときからOLEシステムとの通信に使われていた。
COMはコンポーネント間の通信のためにほかにも多くの標準インタフェースを定めている。たとえばデータストリームを管理するIStreamが挙げられる。これはファイルストリームのコンポーネントがファイルを読み書きする際に使うことが考えられる。IStreamのReadメソッドとWriteメソッドはストリームに対して読み取りと書き込みを行うことが想定される。他の例として、IOleObjectは、呼び出した側がコンポーネントの境界を決められるメソッドを持っており、また「開く」、「保存」などの操作を行うことができる。
[編集] コクラス
COMではクラスのことをコクラス(coclass)と呼ぶ。コクラスは、COMにおける(オブジェクト指向プログラミング的な)クラスを定義する言語非依存の手段である。
1つのコクラスは、1つ以上のインタフェースの具体的な実装を提供する。COMに対応しているプログラミング言語であれば、C++、Visual Basicなどどんな言語でも実装を行うことができる。
COMは、Windows開発の世界に、実装からインタフェースを切り分けるという概念を意識させることをもたらした。これは、今日プログラマがシステム構築に影響を与えることになった。この基本的な概念の延長に、1つのインタフェースに対して複数の実装を用意するという考えが挙がってきた。これは、実行時にアプリケーションがいくつもの実装から選ぶことができるということである。
[編集] インタフェース定義言語とタイプライブラリ
タイプライブラリはCOMのメタデータを保持している。しかしそれらはまずMIDL(マイクロソフトインタフェース定義言語、IDLも参照)を使って記述される。
COMコンポーネントの開発では、普通IDLで型を定義することから始める。IDLファイルではオブジェクト指向的なクラスやインタフェース、構造体、列挙体などのユーザ定義型をプログラミング言語に依存せず記述できる。このIDLではC/C++に似たキーワードと、それに追加してインタフェース定義に用いる「interface」とクラスの集合を現す「library」という2つのキーワードを使用する。また各宣言の前に角括弧[]で括って属性を指定でき、インタフェースにGUID (IID)を指定したり配列引数とその長さを示す引数との関係を指示したりできる。
IDLファイルはMIDLコンパイラで様々なプログラミング言語に向けてコンパイルされる。C/C++用にはインタフェースなどが宣言されたヘッダファイルとGUIDを定義したCのソースファイル、またCOMのメソッド呼び出しをRPC用に変換する「プロキシ」とそれを元に戻す「スタブ」のソースファイルも生成される。
MIDLはIDLファイルからタイプライブラリ(.TLBファイル)も作る。タイプライブラリに含まれているバイナリのメタデータはコンパイラや実行環境(VBやDelphi、.NETのCLRなど)で利用される。その結果タイプライブラリファイルで定義されたCOクラスをその言語や環境に持ち込んで使用できるようになる。
[編集] 関連項目
- ActiveX
- Object Linking and Embedding
- Simple Object Access Protocol : SOAP
- Distributed Component Object Model
- .NET Framework
[編集] 参考文献
- Dale Rogerson著 『Inside COM』 アスキー、1997年。ISBN 4756121764
[編集] 外部リンク
カテゴリ: マイクロソフトのAPI | プログラミング | 並行計算