2010-06-24 3 views
2

Je voudrais savoir comment utiliser la méthode Invoke de la classe TRttiMethod en C++ Builder 2010.TRttiMethod :: Invoke utiliser

Ceci est mon code

Tpp *instance=new Tpp(this); 
TValue *args; 

TRttiContext * ctx=new TRttiContext(); 
TRttiType * t = ctx->GetType(FindClass(instance->ClassName())); 

TRttiMethod *m=t->GetMethod("Show"); 
m->Invoke(instance,args,0); 

Afficher n'a pas d'arguments et c'est __publié. Quand j'exécute, j'obtiens une EInvocationError avec le message "Incompatibilité des comptes de paramètres". Est-ce que quelqu'un peut démontrer l'utilisation de Invoke?

Aucun argument et avec des arguments dans la méthode appelée.

Merci

Josep

Répondre

1

Vous obtenez l'erreur parce que vous dites Invoke() que vous passez dans 1 paramètre de méthode (même si vous êtes vraiment pas, mais qui est un bogue distinct dans votre code). Invoke() prend un OPENARRAY de valeurs TValue en entrée. Malgré son nom, le paramètre Args_Size n'est pas le nombre de paramètres passés, mais l'INDEX du dernier paramètre dans le tableau. Donc, pour passer 0 paramètres de la méthode à afficher() via Invoke(), définissez le paramètre Args NULL et le paramètre Args_Size à -1 au lieu de 0, à savoir:

Tpp *instance = new Tpp(this); 

TRttiContext *ctx = new TRttiContext; 
TRttiType *t = ctx->GetType(instance->ClassType()); 

TRttiMethod *m = t->GetMethod("Show"); 
m->Invoke(instance, NULL, -1); 

delete ctx; 

Maintenant, une fois que vous correctif, vous remarquer Invoke() commencer à lever une exception EInsufficientRtti à la place. Cela se produit lorsque les packages d'exécution sont activés. Malheureusement, la désactivation de packages d'exécution provoque TRttiContext :: GetType() pour élever un EAccessViolation dans TRttiPool :: GetPackageFor() à cause d'un bug de linker connu sous C++:

QC#76875, RAID #272782: InitContext.PackageTypeInfo shouldn't be 0 in a C++ module:

Ce qui provoque ces bugs:

QC#76672, RAID #272419: Rtti.pas is unusable in a C++ application

QC#76877, RAID #272767: AV in TRttiContext::GetType() when Runtime Packages are disabled

Alors vous êtes dans une situation catch-22. Le nouveau système RTTI n'est pas encore prêt pour le travail de production en C++. Vous devrez utiliser Delphi à la place pour le moment.

+0

Ces bogues sont-ils toujours dans XE 7? Merci. –

+0

Je ne sais pas. Deux des billets mentionnés (76875 et 76877) sont toujours ouverts. Le ticket fermé (76672) est dû au fait qu'un AV n'est plus levé lorsque PackageTypeInfo est NULL. Je n'ai aucune idée si ce problème racine a été jamais corrigé ou non. Vous devrez juste l'essayer et voir ce qui se passe. –