2010-06-24 3 views
2

Я хотел бы знать, как использовать метод Invoke класса TRttiMethod в 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); 

Показать не имеет аргументов и он опубликован. Когда я выполняю, я получаю EInvocationError с сообщением «Несоответствие счетчика параметров».

Может ли кто-нибудь продемонстрировать использование Invoke? Оба аргумента и аргументы в вызываемом методе отсутствуют.

Благодаря

Хосеп

ответ

1

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

+0

Есть ли ошибки в XE 7? Благодарю. –

+0

Не знаю. Два из упомянутых билетов (76875 и 76877) по-прежнему открыты. Закрытый билет (76672) заключается в том, что AV больше не возникает, когда 'PackageTypeInfo' является NULL. Я не знаю, была ли эта корневая проблема когда-либо зафиксирована или нет. Вам просто нужно попробовать и посмотреть, что произойдет. –

Смежные вопросы