gpt4 book ai didi

rtti - TRttiMethod::调用使用

转载 作者:行者123 更新时间:2023-12-04 03:15:56 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com