Вы получаете сообщение об ошибке, потому что вы говорите Invoke(), что вы передаете в 1 параметра метода (даже если вы на самом деле нет, но это отдельная ошибка в коде). Invoke() принимает значение OPENARRAY
значений TValue. Несмотря на свое имя, параметр Args_Size
не содержит NUMBER параметров, а является INDEX последнего параметра в массиве. Таким образом, чтобы передать параметры метода 0 Показать() через Invoke(), установите параметр Args
на NULL и параметр -1 вместо 0 Args_Size
, то есть:
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. Это происходит, когда включены Runtime Packages. К сожалению, отключение среды выполнения пакетов будет вызывать TRttiContext :: GetType(), чтобы поднять EAccessViolation в TRttiPool :: GetPackageFor() из-за известного линкера жука под 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
Таким образом, вы находитесь в ситуации, улов-22. Новая система RTTI еще не готова к производственным работам на C++. На данный момент вам придется использовать Delphi.
Есть ли ошибки в XE 7? Благодарю. –
Не знаю. Два из упомянутых билетов (76875 и 76877) по-прежнему открыты. Закрытый билет (76672) заключается в том, что AV больше не возникает, когда 'PackageTypeInfo' является NULL. Я не знаю, была ли эта корневая проблема когда-либо зафиксирована или нет. Вам просто нужно попробовать и посмотреть, что произойдет. –