3

我想知道如何在 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);

Show 没有参数,它是 __published。当我执行时,我收到带有消息“参数计数不匹配”的 EInvocationError。

有人可以演示 Invoke 的使用吗?被调用方法中没有参数和有参数。

谢谢

何塞普

4

1 回答 1

4

您收到错误是因为您告诉 Invoke() 您正在传递 1 个方法参数(即使您确实不是,但这是代码中的一个单独的错误)。Invoke() 将一个OPENARRAYTValue 值作为输入。尽管它的名字,Args_Size参数不是传入参数的数量,而是数组中最后一个参数的索引。因此,要通过 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 异常。启用运行时包时会发生这种情况。不幸的是,禁用运行时包将导致 TRttiContext::GetType() 在 TRttiPool::GetPackageFor() 中引发 EAccessViolation,因为 C++ 下存在一个已知的链接器错误:

QC #76875,RAID #272782:InitContext.PackageTypeInfo 在 C++ 模块中不应为 0

这会导致这些错误:

QC #76672,RAID #272419:Rtti.pas 在 C++ 应用程序中不可用

QC #76877,RAID #272767:当运行时包被禁用时,TRttiContext::GetType() 中的 AV

所以你处于catch-22的情况。新的 RTTI 系统尚未准备好使用 C++ 进行生产工作。您将不得不暂时使用 Delphi。

于 2010-07-07T00:38:42.080 回答