3

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 の使用を実証できますか? 呼び出されたメソッドに引数がない場合と引数がある場合の両方。

ありがとう

ジョセップ

4

1 に答える 1

4

Invoke() に 1 つのメソッド パラメーターを渡していることを伝えているため、エラーが発生します (実際にはそうではありませんが、これはコードの別のバグです)。Invoke() は、OPENARRAYTValue 値の を入力として受け取ります。その名前にもかかわらず、Args_Sizeパラメーターは渡されるパラメーターの NUMBER ではなく、配列内の最後のパラメーターの INDEX です。したがって、Invoke() を介して Show() に 0 のメソッド パラメータを渡すには、Argsパラメータを NULLに設定し、パラメータArgs_Sizeを 0 ではなく -1 に設定します。

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: C++ モジュールで InitContext.PackageTypeInfo を 0 にしないでください:

これらのバグの原因:

QC #76672、RAID #272419: Rtti.pas は C++ アプリケーションでは使用できません

QC #76877、RAID #272767: ランタイム パッケージが無効な場合の TRttiContext::GetType() の AV

つまり、キャッチ 22 の状況です。新しい RTTI システムは、C++ での生産作業の準備がまだ整っていません。当分の間、代わりに Delphi を使用する必要があります。

于 2010-07-07T00:38:42.080 に答える