Invoke() に 1 つのメソッド パラメーターを渡していることを伝えているため、エラーが発生します (実際にはそうではありませんが、これはコードの別のバグです)。Invoke() は、OPENARRAY
TValue 値の を入力として受け取ります。その名前にもかかわらず、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 を使用する必要があります。