オブジェクトのインタフェースへのポインタの取得

オブジェクト識別

オブジェクトの識別により,別の開発グループが作成した 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 つのサブルーチン COMCreateObjectByProgIDCOMCreateObjectByGUID の総称名です。

COMCreateObjectByGUID の引数には以下のものがあります。

COMCreateObjectByProgIDCOMCreateObjectByGUID サブルーチンは,サーバーが外部で作成できるように定義したオブジェクトのインタフェース・ポインタを返します。しかしながら,全てのオブジェクトが外部で作成できるわけではありません。しばしば,サーバーは,オブジェクトまたはオブジェクト・モデルの階層を実装しています。COMCreateObject は,階層のルート・オブジェクトのインタフェースへのポインタを得るために呼び出されます。ルート・オブジェクトのメソッドとプロパティは,階層の下方にある子オブジェクトなどのポインタを得るために使われます。Visual Fortran サンプルAutodiceDlines,および DSbuild でこの例を参照することができます。

全てのオブジェクトは,IUnkown インタフェースを実装していなければなりません。各オブジェクトはまた,1 つ以上の別のインタフェースも実装していなければなりません。COMQueryInterface サブルーチンを使うことによって,オブジェクトのインタフェース・ポインタの全てからオブジェクトのインタフェースの全てへのポインタを常に得ることができます。Moudle Wizard が生成したルーチンを呼び出す時に,正しいオブジェクト・インタフェースへのポインタをもっていなければなりません。そうでなければ,アプリケーションがクラッシュします。

オブジェクトのインタフェースへのポインタの開放

オブジェクトのインタフェース・ポインタの使用が終了した時,ポインタと一緒に COMReleaseObject を呼び出さなければなりません。これは,COMCreateObjectCOMQueryInterface を含むどのメソッドを使うことによって,または,オブジェクトのメソッドを呼び出すことによって受け取ったオブジェクト・ポインタを含みます。