疑問解決(OLE,ActiveX,COM)

2009/9/30

複雑なActiveXについて勉強してみました。

・OLE,ActiveX,COMとは
 ActiveX、COM系は用語からして複雑です。
 まだ、私も完全には理解してないですが、わかる範囲で書きますね。

 OLEとCOMは純粋に技術の名前です。
 そして、ActiveXはその技術の一部を利用して出来上がったものです。
 
用語 解説
ActiveXオートメーション アプリケーションから別のアプリケーションを操作できる機能のことです。
ActiveXコントロール 技術的にはインプロセスサーバの特殊なものです。
以前はOLEコントロールと呼んでいました。
ActiveX DLL ActiveXコントロールとしても利用できるDLLの事を言います。
ActiveX EXE ActiveXコントロールとしても利用できるEXEの事を言います。
・COM(Component Object Model)
COMは、OLEから発展してきた技術です。

COMには下記の種別が存在します。
 ・COMクライアント
 ・COMコンポーネント

COM自身はインターフェースを公開し、
外部アプリケーションはそのインターフェースを利用して、COMと通信を行います。
このインターフェースは、メモリ構造が決められています。
逆にいうと、このメモリ構造どおり作成すれば、どの言語で作成してもよいです。
そのため、ライブラリ等の「ソース互換」と対比して「バイナリ互換」といわれています。

COM アプリケーションを実装するには,以下のものが必要です。
用語 解説
COMインターフェース オブジェクトが自身のサービスをクライアントに対して外部に公開するための手段。
COM オブジェクトは,関連するメソッドとプロパティのセット 1 つにつきインターフェースを 1 つ提供する。
 ・COM インターフェース識別子は大文字の I(アイ)で始まり、
  その後にインターフェースを定義するシンボル名が続きます。
 ・COMインターフェースは、グローバルユニーク識別子(GUID)を持つことが保証されています。
  COMインターフェースの GUID はインターフェース識別子(IID)と呼ばれます。
  IID によって、同一製品の異なるバージョン間や異なる製品間での名前の衝突を避けます。
 ・COMインターフェースは言語に依存しません。
 ・COMインターフェースは、常に基本インターフェース IUnknown. から継承されます。
COMサーバ COM オブジェクトのコードが入っているモジュール(EXE,DLL,OCX のいずれか)。
オブジェクトの実装はサーバー上にある。
1 つの COM オブジェクトが 1 つまたは複数のインターフェースを実装する。
クライアントは、COM オブジェクトからのサービスを要求するとき、クラス識別子(CLSID)を COM に渡します。
CLSID はCOM オブジェクトを識別する GUID です。
CLSID はシステムレジストリに登録してあり、COM はこの CLSID を使用し、適切なサーバーの実装を探します。
適切なサーバーが見つかるとCOM はそのコードをメモリに読み込み、
サーバーのオブジェクトインスタンスをインスタンスします。
COM サーバーは、以下の項目を満たす必要があります。
 ・サーバーモジュールとCLSIDとの関連付けをシステムレジストリに登録する
 ・特定の CLSID の別のオブジェクトを作成するクラスファクトリオブジェクトを実装する
 ・クラスファクトリを COM に公開する
 ・クライアントにサービスを提供していないサーバーをメモリから削除する
COMクライアント 要求されたサービスをサーバーから取得するためにインターフェースを呼び出すコードです。
クライアントは、自分がインターフェースを介してサーバーから何を取得したいかを知っていますが、
サーバーがサービスを提供する仕組みの中身は知りません。
COM クライアントには、コントローラとコンテナの 2 種類があります。


COMインスタンスの作成方法は下記の3通りあります。
 ・CoCreateInstance
 ・CoGetClassObject
 ・モニカオブジェクト
・IUnkownインターフェース
すべてのCOMオブジェクトはIUnkownインターフェースをサポートする必要があります。
IUnkownインターフェースは下記メソッドを含まれます。
メソッド 解説
QueryInterface IIDを使用してインターフェースを問合せます。
AddRef 単純な参照カウントのためのメソッドです。
Release 参照カウントが0のとき、自身を削除するようにします。
・ディスパッチインターフェース(IDispatch)
 実行時にしか、オブジェクトにアクセスできないコントローラ用のインターフェースです。
 このインターフェースを使う場合は、レイトバインディングになります。
 IDispachインターフェースは下記メソッドを実装する必要があります。
メソッド 解説
GetTypeInfoCount オブジェクトの型記述数を戻します。
IDispatch をサポートするオブジェクトに対しては、
型情報数は常に 1 です。
GetTypeInfo オブジェクトのプログラム可能インターフェイスの説明を取り出します。
GetIDsOfNames メソッドまたはプロパティの名前をDISPIDにマッピングします。
これは後でメソッドまたはプロパティを呼び出す場合に使用します。
Invoke オブジェクトのメソッドを呼び出します。
またはオブジェクトのプロパティの獲得や設定を行います。
・カスタムインターフェース
 ユーザ定義のインターフェースです。
 オブジェクトにタイプライブラリが有る場合、
  VTableレイアウトを通じてカスタムインターフェースにアクセスできます。
・dualインターフェース
 カスタムインターフェースでも有り、ディスパッチインターフェイスでもあるインターフェースです。
・バインド方法
 COMクライアントからCOMサーバを呼び出す方法にも3種類の方法があり、
 この方法のことをバインディングを呼びます。
バインド方法 解説
アーリーバインディング 事前に、型変換等を行うため、効率がよく方制限も少ない。
レイトバインディング 動的にメソッドやプロパティが決定される場合、
アーリーバインディングをする事ができない。
この場合、GetIDsOfNamesメソッドやInvokeメソッドを利用して、
実際に呼び出したいメソッドを呼び出す。
VTBLバインディング MIDL生成のヘッダを使用して直接VTBLをアクセスします。
・用語
インプロセス、アウトプロセス
COMは、DLLおよびEXEに実装されます。

DLLタイプのCOMコンポーネントは、リンクされて実行されるためインプロセスサーバと呼びます。
EXEタイプのCOMコンポーネントは、別のプロセス空間を持つためアウトプロセスサーバと呼びます。
 
インプロセス COMを実装したDLLのことです。
ActiveXサーバDLLとも言います。
ピクチャコントロール(IPicture)
アウトプロセス COMを実装したプログラム(EXE)のことです。
ActiveXサーバEXEとも言います。
Dispatchインターフェースを実装したサーバのことを、
オートメーションサーバといいます。
Excel
Word
Internet Explorer
リモート リモートコンピュータで利用できるCOMです。 分散COM(DCOM)
CLSID(クラスID)
内部的に COMコンポーネントを識別する 128ビットの識別子です。
VB等ではProgIDで指定します。
これは内部的に CLSIDに変換されて使用されます。

Visual Studio 6.0のツール OLE View を使って確認できます。
IID(インターフェースID)
内部的に COMインターフェースを識別する 128ビットの識別子です。

Visual Studio 6.0のツール OLE View を使って確認できます。
GUID(グーイッド、Globally Unique Identifier)
別名としてUUID (Universally Unique IDentifier)とも言います。

世界で一意になるように使用される識別子
(必ず一意となるわけではない)
128ビットの2進数値

COMで使い、CLSIDやIIDに使用します。
CoClass
COMインターフェースを実装するクラスをCoClassと言います。
マーシャリング
COMの世界のマーシャリングとは、自分とは無関係の空間に対して、
パラメータを渡す手法のことです。
 
・覚書
 ・DCOM
 ・タイプライブラリ
 ・MIDL(マイクロソフトインタフェース定義言語)
 ・ATL
 ・VTBL
さらに情報が欲しい方は、Google検索で  
Google
・TOPへ戻る

メールはこちらに