Вы получаете ошибку, потому что вы сообщаете 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.