オートメーション オブジェクト(Win32 のみ)
クラスが 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 以外の指令を含めることはできません。パラメータと戻り値型は、オートメーション可能な型でなければなりません。つまり、Byte、Currency、Real、Double、Longint、Integer、Single、Smallint、AnsiString、WideString、TDateTime、Variant、OleVariant、WordBool、インターフェイス型である必要があります。
ディスパッチ インターフェイスのプロパティ
ディスパッチ インターフェイスのプロパティは、アクセス指定子を含みません。 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');
オートメーション メソッド呼び出しのパラメータは、整数、実数、文字列、ブーリアン、ブーリアン、バリアントの型が使用できます。パラメータは、パラメータ式が変数参照のみで構成されており、かつ、その変数参照が、次の型 -- Byte、Smallint、Integer、Single、Double、Currency、System.TDateTime、AnsiString、WordBool、バリアント -- である場合に、参照として渡すことができます。式がこれらの型のいずれかでなかった場合、または、変数でなかった場合、パラメータは値渡しとなります。値パラメータを想定しているメソッドに、参照でパラメータを渡すと、COM が参照パラメータからの値をフェッチしてしまいます。参照パラメータを想定しているメソッドに、値でパラメータを渡すと、エラーが発生します。
デュアル インターフェイス
デュアル インターフェイスは、コンパイル時バインドと、オートメーションを介した実行時バインドの両方をサポートしています。デュアル インターフェイスは、IDispatch から継承していなければなりません。
デュアル インターフェイスのメソッドはすべて(IInterface および IDispatch から継承したものは除く) safecall の規約を使用しなければなりません。そして、すべてのメソッド パラメータおよび戻り値型は、オートメーション可能である必要があります。(オートメーション可能な型は、Byte、Currency、Real、Double、Real48、Integer、Single、Smallint、AnsiString、ShortString、System/TDateTime、Variant、OleVariant、WordBool です。)