COMとは?

プログラミング本やDirect3Dの記事を見ていると,COM(またはDCOM)というキーワードが頻繁に登場します。これは何ですか?


COMといっても,さまざまなモノがありますが,ここではマイクロソフトのコンポーネントアーキテクチャを支えるCOM(Component Object Module)について簡単に説明しておきましょう。
 コンポーネントというのは,ソフトウェアの完成部品のことです。部品には,ボタンやリストボックスのように目に見えるもの(GUIを持つ部品)や,データベースアクセス部品のように目に見えないものなどが含まれます。
 従来,部品といえばアセンブリ言語やC言語のサブルーチン/関数,あるいはC++のクラスライブラリの形をとってきましたが,この種の部品は汎用性が低い欠点があります(ほかの言語で使う場合は書き換えが必要になる,単独では存在できないなど)。
 一方,コンポーネントアーキテクチャは,ドキュメント化された手順に従って利用できる完成部品を提供していこうという考え方です。すでに動く完成部品があれば,ソフトウェアの開発コストを大幅に低減できますし,部品の質を高めれば,それを利用したソフトウェアの質も高まり,クオリティが向上します。
 Windowsには一種の完成部品であるDLL(Dynamic Link Library)という仕組みが存在しています。DLLは,内部の関数をエクスポート(公開)し,ソフトウェアはDLLをロードしてDLL内部の関数を利用できます。
 しかし,DLLだけでは汎用性があるコンポーネントを実現できません。部品を汎用化するには,部品の利用者がすべての部品を共通した手法で扱える必要があります。
 そこで,Windowsでは部品が実装すべきメソッドなど部品の外部仕様(インタフェース)を利用者側が知る方法を,OLEのオブジェクトモデルを利用して規定しました。その規定に従って実装した部品がCOMです(ActiveX/OCX部品もCOMの一種と考えてよいでしょう)。
 COMの実体はEXEファイルやDLLの中に存在します(サーバーと呼びます)。WindowsはCOMを実現するために,いくつかのシステムサポートを実装しており,COM利用者はWindowsのサービスを介して目的のサーバーにアクセスできます。
 また,Windows 98やNT4.0では,COMをネットワークに拡張したDCOMを実装しています。簡単にいうと,DCOMはネットワークの先にある別のコンピュータにある部品を利用する方法を提供する仕組みと考えてよいでしょう。DCOMを使用すると,分散オブジェクトベースのアプリケーションを作成できます。
 COM/DCOMはWindowsにおけるソフトウェアインタフェースの標準として用いられており,例えばDirectXなどもCOM風のインタフェースを使ってプログラミングを行います。実際のCOMの実装については,膨大な解説が必要になるため,本稿では省略しますが,今号の「きままにDOS/Vプログラミング」p.318でも解説していますので,参照するとよいでしょう。
(米田 聡)