我想知道如何在 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 的用法吗?在被调用的方法中既没有参数也有参数。
谢谢
约瑟夫
最佳答案
您收到错误是因为您告诉 Invoke() 您正在传递 1 个方法参数(即使您确实没有传递,但这是代码中的一个单独错误)。 Invoke() 将 TValue 值的 OPENARRAY
作为输入。尽管名称如此,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 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
所以你处于一个 catch-22 的情况。新的 RTTI 系统还没有准备好在 C++ 中进行生产工作。您暂时必须改用 Delphi。
关于rtti - TRttiMethod::调用使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3113379/