オートメーション オブジェクト

提供: Appmethod Topics
移動先: 案内検索

オブジェクト インターフェイス:インデックス への移動

クラスが IDispatch インターフェイスを実装しているオブジェクトは、オートメーションオブジェクトと呼びます(IDispatch インターフェイスは System ユニットに宣言されています)。

オートメーションオブジェクトにアクセスするには、バリアントを使用します。バリアントがオートメーションオブジェクトを参照しているときは、バリアントを通して、オブジェクトのメソッドの呼び出しや、プロパティの参照、設定ができます。ただし、いずれかのユニット、プログラムまたはライブラリに uses 節で、ComObj を含めておく必要があります。

ディスパッチインターフェイス型

ディスパッチインターフェイス型は、オートメーションオブジェクトが IDispatch 経由で実装するメソッドとプロパティを定義するものです。ディスパッチインターフェイスのメソッドの呼び出しは、実行時に IDispatch の Invoke メソッド経由でルート指定されます。クラスは、ディスパッチインターフェイスを実装できません。

ディスパッチインターフェイスの型宣言の形式は次のとおりです。


type interfaceName = dispinterface
	['{GUID}']
	memberList
end;

['{GUID}'] は省略でき、memberList はプロパティとメソッドの宣言で構成されます。ディスパッチインターフェイスの宣言は通常のインターフェイス宣言に似ていますが、上位を指定できません。次に例を示します。


type
     	IStringsDisp = dispinterface
     	['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}']
    	 property ControlDefault[Index: Integer]: OleVariant dispid 0; default;
    	 function Count: Integer; dispid 1;
   	  property Item[Index: Integer]: OleVariant dispid 2;
   	  procedure Remove(Index: Integer); dispid 3;
   	  procedure Clear; dispid 4;
   	  function Add(Item: OleVariant): Integer; dispid 5;
   		 function _NewEnum: IUnknown; dispid -4;
     end;

ディスパッチインターフェイスのメソッド

ディスパッチインターフェイスのメソッドは、基礎になる IDispatch 実装の Invoke メソッドの呼び出しに対するプロトタイプです。メソッドに対するオートメーションディスパッチ ID を指定するには、その宣言中に dispid 指令を入れ、その後に整数定数を続けます。既に使った ID を指定するとエラーになります。

ディスパッチインターフェイスで宣言されたメソッドが dispid 以外の指令を含むことはできません。パラメータと結果の型はオートメーション可能な型である必要があります。つまり、ByteCurrencyRealDoubleLongintIntegerSingleSmallintAnsiStringWideStringBorland.Object Pascal.System.TDateTime、Variant、OleVariantWordBool、またはインターフェイス型である必要があります。

ディスパッチインターフェイスのプロパティ

ディスパッチインターフェイスのプロパティはアクセス指定子を含みません。read only または write only として宣言できます。プロパティに対するディスパッチ ID を指定するには、その宣言中に dispid 指令を入れ、その後に整数定数を続けます。既に使った ID を指定するとエラーになります。配列プロパティは default として宣言できます。ディスパッチインターフェイスのプロパティの宣言に、これ以外の指令を入れることはできません。

オートメーションオブジェクトへのアクセス

オートメーションオブジェクトのメソッド呼び出しは実行時に結合されます。あらかじめメソッドを宣言しておく必要はありません。これらの呼び出しが有効かどうかは、コンパイル時には確認されません。

次にオートメーションメソッド呼び出しの例を示します。CreateOleObject 関数(ComObj 内に定義されている)は、オートメーションオブジェクトへの IDispatch 参照を返します。また、バリアント Word と代入の互換性があります。


var
 Word: Variant;
  begin
   Word := CreateOleObject('Word.Basic');
   Word.FileNew('Normal');
   Word.Insert('This is the first line'#13);
   Word.Insert('This is the second line'#13);
   Word.FileSaveAs('c:\temp\test.txt', 3);
  end;

インターフェイス型パラメータはオートメーションメソッドに渡すことができます。

要素型が varByte のバリアント配列は、オートメーションのコントローラとサーバーの間でバイナリデータを受け渡すためによく使用されます。そのような配列はデータの変換によって影響を受けず、VarArrayLock ルーチンと VarArrayUnlock ルーチンを使って効率的にアクセスできます。

オートメーションオブジェクトのメソッド呼び出しの構文

オートメーションオブジェクトのメソッド呼び出しまたはプロパティアクセスの構文は、通常のメソッド呼び出しまたはプロパティアクセスの構文に似ています。ただし、オートメーションのメソッド呼び出しでは定位置パラメータも名前付きパラメータも使用できます。(一部のオートメーションサーバーは名前付きパラメータをサポートしていません)。

定位置パラメータは単なる式です。名前付きパラメータはパラメータ識別子の後に記号 := を続け、その後に式を置きます。定位置パラメータはメソッド呼び出しの中で名前付きパラメータの前に置かなければなりません。名前付きパラメータはどのような順序でも指定できます。

一部のオートメーションサーバーでは、メソッド呼び出しでパラメータを省略して、デフォルト値をそのまま採用することもできます。次に例を示します。


     Word.FileSaveAs('test.doc');
     Word.FileSaveAs('test.doc', 6);
     Word.FileSaveAs('test.doc',,,'secret');
     Word.FileSaveAs('test.doc', Password := 'secret');
     Word.FileSaveAs(Password := 'secret', Name := 'test.doc');

オートメーションのメソッド呼び出しパラメータは整数型、実数型、文字列型、論理型、バリアント型のいずれかの型を指定できます。パラメータはパラメータ式が変数参照だけで構成されている場合、その変数参照が ByteSmallintIntegerSingleDoubleCurrencyBorland.Object Pascal.System.TDateTimeAnsiStringWordBool、Variant のいずれかの型であると参照渡しされます。式が上に示した型のどれでもない場合、または単なる変数でない場合、パラメータは値渡しされます。値パラメータを期待するメソッドへパラメータを参照渡しを実行すると、COM は参照パラメータから値を取得します。参照パラメータを期待するメソッドへパラメータを値渡しを実行するとエラーになります。

デュアルインターフェイス

デュアルインターフェイスは、オートメーションによってコンパイル時の結合と実行時の結合の両方をサポートするインターフェイスです。デュアルインターフェイスは IDispatch から派生しなければなりません。

デュアルインターフェイスのすべてのメソッド(IInterface および IDispatch から継承したものは除く)は safecall 規約を使用しなければならず、すべてのメソッドパラメータおよび結果の型はオートメーション可能である必要があります。オートメーション型として宣言可能な型は、ByteCurrencyRealDoubleReal48IntegerSingleSmallintAnsiStringShortStringBorland.Object Pascal.System.TDateTime、Variant、OleVariantWordBool です。

関連項目