TRttiMethod :: Использование Invoke - PullRequest
2 голосов
/ 24 июня 2010

Я хотел бы знать, как использовать метод Invoke класса TRttiMethod в C ++ Builder 2010.

Это мой код

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? И без аргументов, и с аргументами в вызываемом методе.

Спасибо

Хосеп

1 Ответ

2 голосов
/ 07 июля 2010

Вы получаете ошибку, потому что вы сообщаете Invoke (), что передаете 1 параметр метода (даже если это не так, но это отдельная ошибка в вашем коде).Invoke () принимает OPENARRAY значений TValue в качестве входных данных.Несмотря на свое имя, параметр Args_Size не является КОЛИЧЕСТВОМ передаваемых параметров, а является ИНДЕКСОМ последнего параметра в массиве.Итак, чтобы передать 0 параметров метода в Show () через Invoke (), установите для параметра 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;

Now,как только вы исправите это, вы заметите, что Invoke () начинает вызывать исключение EInsufficientRtti.Это происходит, когда включены пакеты времени выполнения.К сожалению, отключение пакетов времени выполнения приведет к тому, что TRttiContext :: GetType () вызовет EAccessViolation в TRttiPool :: GetPackageFor () из-за известной ошибки компоновщика в C ++:

QC # 76875, RAID # 272782:InitContext.PackageTypeInfo не должно быть 0 в модуле C ++ :

, что приводит к следующим ошибкам:

QC # 76672, RAID # 272419: Rtti.pas не используется вприложение C ++

QC # 76877, RAID # 272767: AV в TRttiContext :: GetType (), когда пакеты времени выполнения отключены

Итак, вы находитесь вуловка-22 ситуация.Новая система RTTI еще не готова к работе на C ++.Вместо этого вам пока придется использовать Delphi.

...