rtti - TRttiMethod::调用使用

标签 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);

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/

相关文章:

c++builder - 在 borland c++ builder 中的表单之间传输数据

openssl - 无法连接到 Indy SSL TCP 服务器

winapi - 如何让鼠标光标不可见?

c++ - Rad Studio 调试器线程中未处理的异常

delphi - 如何使用delphi 2010 rtti设置数组长度

c++ - 使用共享库中的多态对象安全吗?

delphi - TForm 上的 RTTI GetFields 和 GetAttributes

c++ - C++中如何根据参数的值返回不同的类型?

c++ - 存储有关对象类型的信息

C++ 断点被忽略/遗漏