TRttiMethod ::调用使用

时间:2010-06-24 19:48:31

标签: rtti c++builder-2010

我想知道如何在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吗?在被调用的方法中都没有参数和参数。

由于

何塞普

1 个答案:

答案 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。

相关问题