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 System::NativeInt ParamIndexes_High, const System::Variant *Params, const System::NativeInt Params_High);
Propriétés
Type | Visibilité | Source | Unité | Parent |
---|---|---|---|---|
function | public | System.ObjAuto.pas System.ObjAuto.hpp |
System.ObjAuto | System.ObjAuto |
Description
Invoque dynamiquement une méthode d'un objet.
Utilisez ObjectInvoke pour appeler dynamiquement une méthode d'un objet. Cette méthode doit disposer d'informations suffisantes sur le type.
Paramètre | Description |
---|---|
Instance | Instance de la classe à laquelle appartient la méthode. |
MethodHeader | Représente les informations de type de la méthode. Elles peuvent s'obtenir via GetMethodInfo. |
ParamIndexes | Tableau d'index des paramètres. Le principe est que les index sont décalés de 1. Le nombre d'index ne doit pas correspondre au nombre de paramètres. Les paramètres restants sont censés compléter les trous laissés par les index. Les index ParamIndexes sont censés suivre l'ordre lexical, et non l'ordre lexical inversé, comme les paramètres Params. |
Params | Tableau de type Variant contenant les paramètres d'appel de la fonction. L'ordre des paramètres est censé suivre l'ordre lexical inversé, avec le dernier paramètre en première position. |
ObjectInvoke peut appeler :
- une méthode à 31 paramètres sans type de retour
- une méthode à 30 ou 31 paramètres avec un type de retour
Un type de retour complexe inclut String ou le type d'enregistrement requiert un paramètre caché. Dans ce cas, ObjectInvoke peut appeler la méthode à 30 paramètres.
ObjectInvoke ne résout pas les méthodes surchargées. GetMethodInfo renvoie la première entrée de méthode surchargée de la liste des méthodes. Pour sélectionner la méthode correcte, vous pouvez utiliser la fonction System.Rtti.TRttiType.GetMethods ou d'autres fonctions RTTI. En outre, ObjectInvoke ne supporte pas de paramètre par défaut.
ObjectInvoke a besoin d'informations System.Rtti pour décider du nombre de paramètres, du type de paramètres et du type de retour. Si la méthode d'appel manque d'informations System.Rtti, ObjectInvoke déclenche une classe Exception avec le message SNoRTTIInfoType. Les méthodes suivantes ne disposent pas d'informations System.Rtti :
- Méthode Safecall
- Paramètres avec tableau ouvert (par exemple :
procedure foo( ary: array of integer )
) - Paramètres avec un type énuméré à valeur assignée (par exemple :
TFoo = (a, b, c = 100)
)
Pour Windows 32 et OSX 32 uniquement :
Comme Variant OLE (Windows) ne supporte pas le type Extended 80 bits, le type Variant ne peut pas conserver une valeur à virgule flottante Extended 80 bits / 10 octets. Si une méthode a un paramètre de type Extended ou renvoie une valeur de type Extended, ObjectInvoke déclenche une classe EObjectInvokeExtendedTypeException.
Si le type de retour de la méthode est Extended, ObjectInvoke appelle la méthode, capture la valeur Extended et déclenche l'exception EObjectInvokeExtendedTypeException avec la valeur Extended d'origine. L'application peut accéder à la propriété Ext pour obtenir la valeur de retour d'origine.
Le nouvel indicateur RaiseExceptionForExtendedType est introduit dans l'unité System.ObjAuto. Cet indicateur a la valeur TRUE par défaut.
- Si cet indicateur a la valeur True, ObjectInvoke suit le même comportement que la version précédente. Si un paramètre a le type Extended ou si le type de retour est Extended, ObjectInvoke déclenche l'exception.
- Si cet indicateur a la valeur False, ObjectInvoke convertit tout paramètre de type Extended en type Double 64 bits avant d'appeler une méthode, puis convertit la valeur de retour Extended en Double.
Voir aussi
- 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