オブジェクト識別
オブジェクトの識別により,別の開発グループが作成した COM オブジェクトを使用することができます。オブジェクトの出所にかかわらず,オブジェクト・クラスを一意に識別するための手段を提供するために,COM はグローバル・ユニーク識別子 (GUID) を使用しています。GUID は,空間と時間を超えた一意性が (実用上のレベルで) 保証される 16 バイトの整数値です。COM は,オブジェクト・クラス,インタフェース,およびその他の一意の識別を必要とする要素を識別するために GUID を使用します。
オブジェクトのインスタンスを作成するには,COM に対して,オブジェクトの GUID を指示する必要があります。識別に 16 バイトの整数を使うのは,コンピュータにとっては問題ありませんが,一般の開発者にとっては問題となります。このため,COM はプログラマティック識別子 (ProgID) と呼ばれる,より精度の低いテキスト名もサポートします。ProgID の形式を次に示します。
application_name.object_name.object_version
オブジェクトのインタフェースへのポインタの取得
Module Wizard が生成したルーチンを使用するには,アプリケーションはオブジェクトのインタフェースへのポインタを取得しなければなりません。このポインタは,Moudle Wizard が生成した全てのインタフェースの第 1 引数である $OBJECT 引数の値として使用されます。
一般的に,アプリケーションは COM ルーチンの COMCreateObject を呼び出して第 1 オブジェクト・ポインタを得ます。COMCreateObject は,オブジェクト・クラスの新しいインスタンスを作成します。COMCreateObject は,2 つのサブルーチン COMCreateObjectByProgID と COMCreateObjectByGUID の総称名です。
オートメーション・オブジェクトを作成するには,COMCreateObjectByProgID を使用します。これは,オブジェクトの ProgID を受け取り,オブジェクトの IDispatch インタフェースへのポインタを返します。
COM とオートメーション・オブジェクトの両方を作成するには,COMCreateObjectByGUID を使用します。
COMCreateObjectByGUID の引数には以下のものがあります。
第 1 引数は,オブジェクトのクラスをユニークに識別するクラス識別子 (CLSID) です。Module Wizard は,タイプ・ライブラリーから選択した各クラスに対する GUID パラメタを定義します。これらは,CLSID_class-name の形式に名前を与えます。
第 2 引数は,呼び出しが受け付けられるサーバーのタイプを制限することを許可します。多くの場合,CLSCTX_ALL を使って全てのサーバーのタイプを受け付けます。
第 3 引数は,要求する特定のオブジェクト・インタフェースを指定するインタフェース識別子 (IID) です。
AUTO インタフェースを要求するには,IID_IDispatch を使用します。
Module Wizard は タイプ・ライブラリーから選択した各インタフェースに対する GUID パラメタを定義しています。これらは,IID_interface-name 形式の名前を与えます。COM インタフェースを要求するには,これを使用します。
第 4 引数は,オブジェクトのインタフェース・ポインタを返す出力パラメタです。
COMCreateObjectByProgID と COMCreateObjectByGUID サブルーチンは,サーバーが外部で作成できるように定義したオブジェクトのインタフェース・ポインタを返します。しかしながら,全てのオブジェクトが外部で作成できるわけではありません。しばしば,サーバーは,オブジェクトまたはオブジェクト・モデルの階層を実装しています。COMCreateObject は,階層のルート・オブジェクトのインタフェースへのポインタを得るために呼び出されます。ルート・オブジェクトのメソッドとプロパティは,階層の下方にある子オブジェクトなどのポインタを得るために使われます。Visual Fortran サンプルの Autodice,Dlines,および DSbuild でこの例を参照することができます。
全てのオブジェクトは,IUnkown インタフェースを実装していなければなりません。各オブジェクトはまた,1 つ以上の別のインタフェースも実装していなければなりません。COMQueryInterface サブルーチンを使うことによって,オブジェクトのインタフェース・ポインタの全てからオブジェクトのインタフェースの全てへのポインタを常に得ることができます。Moudle Wizard が生成したルーチンを呼び出す時に,正しいオブジェクト・インタフェースへのポインタをもっていなければなりません。そうでなければ,アプリケーションがクラッシュします。
オブジェクトのインタフェースへのポインタの開放
オブジェクトのインタフェース・ポインタの使用が終了した時,ポインタと一緒に COMReleaseObject を呼び出さなければなりません。これは,COMCreateObject,COMQueryInterface を含むどのメソッドを使うことによって,または,オブジェクトのメソッドを呼び出すことによって受け取ったオブジェクト・ポインタを含みます。