我想知道如何在C ++ Builder 2010中使用TRttiMethod类的Invoke方法。
这是我的代码
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);
显示没有参数,它是__published。当我执行时,我得到一个带有“参数计数不匹配”消息的EInvocationError。
有人可以证明使用Invoke吗?在被调用的方法中都没有参数和参数。
由于
何塞普
答案 0 :(得分:2)
您收到错误是因为您告诉Invoke()您传入了1个方法参数(即使您确实不是,但这是您代码中的单独错误)。 Invoke()将OPENARRAY
个TValue值作为输入。尽管它的名称,Args_Size
参数不是传入的参数的数量,而是数组中最后一个参数的INDEX。因此,要通过Invoke()将0方法参数传递给Show(),请将Args
参数设置为NULL,将Args_Size
参数设置为-1而不是0,即:
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;
现在,一旦你解决了这个问题,你会发现Invoke()开始引发一个EInsufficientRtti异常。启用运行时包时会发生这种情况。不幸的是,由于C ++下已知的链接器错误,禁用运行时包将导致TRttiContext :: GetType()在TRttiPool :: GetPackageFor()中引发EAccessViolation:
QC #76875, RAID #272782: InitContext.PackageTypeInfo shouldn't be 0 in a C++ module:
导致这些错误:
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
所以你处于陷阱状态。新的RTTI系统尚未准备好在C ++中进行生产工作。你将不得不暂时使用Delphi。