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

提供: RAD Studio
移動先: 案内検索

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

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

オートメーション オブジェクトにアクセスするには、バリアントを使用します。バリアントがオートメーション オブジェクトを参照しているときは、バリアントを通して、オブジェクトのメソッドの呼び出しや、そのプロパティの読み書きを行うことができます。これを行うには、ComObj を、いずれかのユニットやプログラムまたはライブラリの、 uses 句に入れなければなりません。

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

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

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

type InterfaceName = dispinterface
  ['{GUID}']
  // …
end;

WHERE

['{GUID}']

これは任意で、インターフェイスには、プロパティとメソッドの宣言が入ります。ディスパッチ インターフェイス宣言は、通常のインターフェイス宣言と同様ですが、先祖を指定することはできません。

例:

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 以外の指令を含めることはできません。パラメータと戻り値型は、オートメーション可能な型でなければなりません。つまり、ByteCurrencyRealDoubleLongintIntegerSingleSmallintAnsiStringWideStringTDateTimeVariantOleVariantWordBool、インターフェイス型である必要があります。

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

ディスパッチ インターフェイスのプロパティは、アクセス指定子を含みません。 readonly または writeonly として宣言できます。 プロパティに対してディスパッチ 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 であるバリアント配列は、OLE オートメーション コントローラと OLE オートメーション サーバーの間でバイナリ データを受け渡しするための方法として推奨されています。 そのような配列は、データの解釈に制約されず、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');

オートメーション メソッド呼び出しのパラメータは、整数、実数、文字列、ブーリアン、ブーリアン、バリアントの型が使用できます。パラメータは、パラメータ式が変数参照のみで構成されており、かつ、その変数参照が、次の型 -- ByteSmallintIntegerSingleDoubleCurrencySystem.TDateTimeAnsiStringWordBool、バリアント -- である場合に、参照として渡すことができます。式がこれらの型のいずれかでなかった場合、または、変数でなかった場合、パラメータは値渡しとなります。値パラメータを想定しているメソッドに、参照でパラメータを渡すと、COM が参照パラメータからの値をフェッチしてしまいます。参照パラメータを想定しているメソッドに、値でパラメータを渡すと、エラーが発生します。

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

デュアル インターフェイスは、コンパイル時バインドと、オートメーションを介した実行時バインドの両方をサポートしています。デュアル インターフェイスは、IDispatch から継承していなければなりません。

デュアル インターフェイスのメソッドはすべて(IInterface および IDispatch から継承したものは除く) safecall の規約を使用しなければなりません。そして、すべてのメソッド パラメータおよび戻り値型は、オートメーション可能である必要があります。(オートメーション可能な型は、ByteCurrencyRealDoubleReal48IntegerSingleSmallintAnsiStringShortStringSystem/TDateTime、Variant、OleVariantWordBool です。)

関連項目