System.ObjAuto.ObjectInvoke

Aus RAD Studio API Documentation
Wechseln zu: Navigation, Suche

Delphi

function ObjectInvoke(Instance: TObject; MethodHeader: PMethodInfoHeader; const ParamIndexes: array of Integer; const Params: array of Variant): Variant;

C++

extern DELPHI_PACKAGE System::Variant __fastcall ObjectInvoke(System::TObject* Instance, PMethodInfoHeader MethodHeader, const int *ParamIndexes, const int ParamIndexes_High, const System::Variant *Params, const int Params_High);

Eigenschaften

Typ Sichtbarkeit Quelle Unit Übergeordnet
function public
System.ObjAuto.pas
System.ObjAuto.hpp
System.ObjAuto System.ObjAuto

Beschreibung

Ruft eine Methode eines Objekts dynamisch auf.

Mit ObjectInvoke können Sie eine Methode eines Objekts dynamisch aufrufen. Diese Methode muss über ausreichende Typinformationen verfügen.

Parameter Beschreibung
Instance Die Instanz der Klasse, zu der die Methode gehört.
MethodHeader Repräsentiert die Typinformationen der Methode. Diese können mit GetMethodInfo ermittelt werden.
ParamIndexes Ein Array mit den Indizes der Parameter. Dabei wird vorausgesetzt, dass die Indizes den Offset 1 haben. Die Anzahl der Indizes muss nicht mit der Anzahl der Parameter übereinstimmen. Für die übrigen Parameter wird davon ausgegangen, dass sie die Lücken zwischen den Indizes füllen. Bei ParamIndexes wird davon ausgegangen, dass sie in lexikalischer Reihenfolge vorliegen, nicht in umgekehrter lexikalischer Reihenfolge wie Params.
Params Ein Array vom Typ Variant, das die Parameter für den Funktionsaufruf enthält. Bei diesen Parametern wird davon ausgegangen, dass sie in umgekehrter lexikalischer Reihenfolge (der letzte Parameter zuerst) vorliegen.


ObjectInvoke kann Folgendes aufrufen:

  • eine Methode mit 31 Parametern ohne einen Rückgabetyp
  • eine Methode mit 30 oder 31 Parametern mit einem Rückgabetyp

Einige komplexe Rückgabetypen, wie String- oder Datensatztypen, benötigen verborgene Parameter. In diesen Fällen kann ObjectInvoke eine Methode mit 30 Parametern aufrufen.

ObjectInvoke löst keine überladenen Methoden auf. GetMethodInfo gibt den ersten Eintrag der überladenen Methode aus der Methodenliste zurück. Zum Auswählen der geeigneten Methode können Sie die Funktion System.Rtti.TRttiType.GetMethods oder andere RTTI-Funktionen verwenden. ObjectInvoke unterstützt außerdem keinen Standardparameter.


ObjectInvoke benötigt zum Ermitteln der Anzahl der Parameter, des Typs der Parameter und des Rückgabetyps System.Rtti-Informationen. Wenn die aufrufende Methode nicht über ausreichende System.Rtti-Informationen verfügt, löst ObjectInvoke eine Exception-Klasse mit einer SNoRTTIInfoType-Meldung aus. Die folgenden Methoden verfügen über keine System.Rtti-Informationen:

  • die Methode Safecall
  • alle Parameter, die ein offenes Array haben (zum Beispiel: procedure foo( ary: array of integer ) )
  • alle Parameter, die einen zugewiesenen Wert mit einem Aufzählungstyp haben (zum Beispiel: TFoo = (a, b, c = 100) )


Nur für Windows 32 und OSX 32:

Weil OLE-Varianten (Windows) den 80-Bit-Extended-Typ nicht unterstützen, kann der Typ Variant keinen 80-Bit/10-Byte-Extended-Gleitkommawert speichern. Wenn eine Methode den Typparameter Extended hat oder einen Extended-Typwert zurückgibt, löst ObjectInvoke eine EObjectInvokeExtendedTypeException aus.

Wenn der Rückgabetyp einer Methode ein Extended-Typ ist, ruft ObjectInvoke die Methode auf, fängt den Extended-Wert ab und löst eine EObjectInvokeExtendedTypeException mit dem ursprünglichen Extended-Wert aus. Die Anwendung kann auf die Eigenschaft Ext zugreifen, um den Originalrückgabewert abzurufen.

Das neue RaiseExceptionForExtendedType-Flag wurde in der Unit System.ObjAuto eingeführt. Dieses Flag ist standardmäßig TRUE.

  • Wenn dieses Flag True ist, hat ObjectInvoke dasselbe Verhalten wie in der vorherigen Version. Wenn ein Parameter einen Extended-Typ hat oder der Rückgabetyp ein Extended-Typ ist, löst ObjectInvoke die Exception aus.
  • Wenn dieses Flag False ist, wandelt ObjectInvoke vor dem Aufruf einer Methode alle Extended-Typparameter in einen 64-Bit-Double-Typ um und wandelt dann den Extended-Rückgabetyp in Double um.
Hinweis: Die Methode Invoke und der Typ TValue können den Extended-Typ behandeln.

Siehe auch

Codebeispiele