Automatisierungsobjekte
Nach oben zu Objekt-Interfaces - Index
Ein Objekt, dessen Klasse die in der Unit System deklarierte Schnittstelle IDispatch implementiert, ist ein Automatisierungsobjekt.
Der Zugriff auf Automatisierungsobjekte erfolgt über Varianten. Wenn ein Automatisierungsobjekt über eine Variante referenziert wird, können die Eigenschaften des Objekts durch einen Aufruf der entsprechenden Objektmethoden über die Variante gelesen und geändert werden. Zu diesem Zweck muss ComObj in die uses-Klausel einer der Units, des Programms oder der Bibliothek aufgenommen werden.
Inhaltsverzeichnis
Typen für Dispatch-Schnittstellen
Über Dispatch-Schnittstellen werden die Methoden und Eigenschaften definiert, die ein Automatisierungsobjekt mithilfe des IDispatch-Interface implementiert. Aufrufe der Methoden eines Dispatch-Interface werden zur Laufzeit über die Methode Invoke von IDispatch weitergeleitet. Ein Dispatch-Interface kann nicht von einer Klasse implementiert werden.
Die Syntax zur Deklaration eines Dispatch-Interface lautet:
type InterfaceName = dispinterface
['{GUID}']
// …
end;
Die Angabe von
['{GUID}']
ist optional. Elementliste besteht aus Eigenschafts- und Methodendeklarationen. Eine Dispatch-Interface-Deklaration hat große Ähnlichkeit mit der Deklaration eines normalen Interface, mit dem Unterschied, dass kein Vorfahr angegeben werden kann. Beispiel:
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;
Methoden für Dispatch-Interfaces
Die Methoden für ein Dispatch-Interface stellen Prototypen für Aufrufe der Methode Invoke dar, die zur zugrundeliegenden Implementation von IDispatch gehört. Um für eine Methode eine Dispatch-ID für die Automatisierung festzulegen, nehmen Sie in die Methodendeklaration die Direktive dispid und eine Integer-Konstante auf. Die Verwendung einer bereits vergebenen Dispatch-ID führt zu einem Fehler.
Eine Methode, die in einem Dispatch-Interface deklariert wird, darf neben dispid keine weiteren Direktiven enthalten. Parameter und Ergebnistypen müssen automatisierbar sein. Automatisierbare Typen sind: Byte, Currency, Real, Double, Longint, Integer, Single, Smallint, AnsiString, WideString, Borland.Delphi.System.TDateTime, Variant, OleVariant und WordBool sowie alle Interface-Typen.
Eigenschaften für Dispatch-Interfaces
Die Eigenschaften eines Dispatch-Interface enthalten keine Zugriffsbezeichner. Sie können entweder mit der Direktive read only oder mit der Direktive write only deklariert werden. Zur Festlegung einer Dispatch-ID für eine Eigenschaft nehmen Sie die Direktive dispid in die Eigenschaftsdeklaration auf. Auf dispid muss eine Integer-Konstante folgen. Die Verwendung einer bereits vergebenen Dispatch-ID führt zu einem Fehler. Mithilfe der Direktive default können Sie eine Array-Eigenschaft als Standardeigenschaft für das Interface festlegen. Eigenschaftsdeklarationen für Dispatch-Interfaces dürfen keine anderen als die genannten Direktiven enthalten.
Zugriff auf Automatisierungsobjekte
Da Aufrufe von Methoden des Automatisierungsobjekts zur Laufzeit gebunden werden, sind keine Methodendeklarationen erforderlich. Die Gültigkeit solcher Aufrufe wird vom Compiler nicht überprüft.
Das folgende Beispiel demonstriert Aufrufe von Automatisierungsmethoden. Die (in ComObj definierte) Funktion CreateOleObject gibt eine IDispatch-Referenz auf ein Automatisierungsobjekt zurück und ist zuweisungskompatibel zur Variante Word.
var
Word: Variant;
begin
Word := CreateOleObject('Word.Basic');
Word.FileNew('Normal');
Word.Insert('Das ist die erste Zeile '#13);
Word.Insert('Das ist die zweite Zeile '#13);
Word.FileSaveAs('c:\temp\test.txt', 3);
end;
Parameter vom Typ eines Interface können an Automatisierungsmethoden übergeben werden.
Die Übergabe binärer Daten zwischen Automatisierungs-Controllern und Automatisierungs-Servern erfolgt bevorzugt über variante Arrays mit dem Elementtyp varByte. Da die Daten derartiger Arrays nicht übersetzt werden, können Sie mit den Routinen VarArrayLock und VarArrayUnlock effizient darauf zugreifen.
Syntax für Aufrufe von Automatisierungsmethoden
Aufrufe von Methoden eines Automatisierungsobjekts und Zugriffe auf die Eigenschaften des Objekts folgen einer ähnlichen Syntax wie normale Methodenaufrufe und Eigenschaftszugriffe. Beim Aufruf einer Automatisierungsmethode können aber sowohl Positionsparameter als auch benannte Parameter verwendet werden (benannte Parameter werden allerdings nicht von allen Automatisierungs-Servern unterstützt).
Ein Positionsparameter ist einfach ein Ausdruck. Ein benannter Parameter setzt sich aus einem Parameterbezeichner, dem Symbol := und einem Ausdruck zusammen. In einem Methodenaufruf müssen Positionsparameter immer vor benannten Parametern angegeben werden. Die Reihenfolge der benannten Parameter ist beliebig.
Bei bestimmten Automatisierungs-Servern können in Methodenaufrufen Parameter weggelassen werden. In diesem Fall werden Standardwerte verwendet. Beispiel:
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');
Sie können einer Automatisierungsmethode neben Parametern vom Typ Integer und String auch reelle, Boolesche und variante Typen übergeben. Parameterausdrücke, die nur aus einer Variablenreferenz bestehen, werden als Referenz übergeben. Dies gilt allerdings nur, wenn die Variablenreferenz einen der folgenden Typen hat: Byte, Smallint, Integer, Single, Double, Currency, Borland.Delphi.System.TDateTime, AnsiString, WordBool oder Variant. Hat der Ausdruck einen anderen Typ oder handelt es sich nicht um eine Variable, wird der Parameter als Wert übergeben. Wird ein Parameter per Referenz an eine Methode übergeben, die einen Wert-Parameter erwartet, ermittelt COM den Wert aus der Referenz. Dagegen führt die Übergabe eines Wert-Parameters an eine Methode, die eine Übergabe per Referenz erwartet, zu einem Fehler.
Duale Schnittstellen
Ein duales Interface ist ein Interface, das sowohl die Bindung zur Compilierzeit als auch die Laufzeitbindung mittels Automatisierung unterstützt. Duale Interfaces müssen Nachkommen von IDispatch sein.
Alle Methoden eines dualen Interface (mit Ausnahme der von IInterface und IDispatch geerbten Methoden) müssen die Aufrufkonvention safecall verwenden. Alle Methodenparameter und Ergebnistypen müssen den Anforderungen der Automatisierung entsprechen. (Automatisierbare Typen sind: Byte, Currency, Real, Double, Real48, Integer, Single, Smallint, AnsiString, ShortString, Borland.Delphi.System.TDateTime, Variant, OleVariant und WordBool.)