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