4

TCustomVariantType について読んでいて、カスタム バリアント型の変数が 1 つ以上の配列インデックスで呼び出されたときの動作をオーバーライドする方法があるかどうかを知りたいです。デバッグ DCU のa[1]whereaがバリアントで簡単なデバッグを行うと、 get が呼び出されていることがわかりますが、代替手段を提供する方法がなく、or_VarArrayGetへの呼び出しに集中します。以前のバージョンでは VariantManager が使用されていましたが、これは推奨されていません。ポインターを置き換える方法はありますか?SafeArrayPtrOfIndexSafeArrayGetElement_VarArrayGet

4

1 に答える 1

0

a[x] が VarArrayGet(a,[x]) の呼び出しになるように、システムはどのように接続されていますか?

Delphi の最新バージョンのコンパイラには、バリアントの知識が組み込まれており、への呼び出しがハードワイヤされていますVarArrayGet。x86 コンパイラが発行するコードを見てください。

d := V[0];

に翻訳されます:

004234D7 6A00 プッシュ $00
004234D9 6A01 プッシュ $01
004234DB 6858AF4200 プッシュ $0042af58
004234E0 8D45C8 lea eax,[ebp-$38]
004234E3 50 プッシュ eax
004234E4 E81BD8FFFF @VarArrayGet を呼び出す
004234E9 83C410 追加 esp、$10
004234EC 8D45C8 lea eax,[ebp-$38]
004234EF E864B8FFFF コール @VarToReal
004234F4 DD1D68AF4200 fstp qword ptr [$0042af68]
004234FA 9B待ち

利用できる拡張ポイントはありません。

動作を変更したい場合の最良のオプションは、ランタイム コードの回り道を使用することです。

于 2014-03-20T20:29:28.507 に答える