System.ObjAuto.ObjectInvoke
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);
Inhaltsverzeichnis
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.
Siehe auch
- System.ObjAuto.PMethodInfoHeader
- System.ObjAuto.TMethodInfoHeader
- System.ObjAuto.GetMethodInfo
- System.ObjAuto.EObjectInvokeExtendedTypeException
- System.ObjAuto.RaiseExceptionForExtendedType
- System.ObjAuto.EObjectInvokeExtendedTypeException.Ext
- System.Rtti.Invoke
- System.Rtti.TValue
- System.Extended
- System.Variant
- System.Double