イベント ハンドラーを保持する変数のアドレスを取得するにはどうすればよいですか?
例えば
TExample = class(TObject)
private
FOnChange: TNotifyEvent;
end;
プライベート メンバ、イベント ハンドラ、変数のアドレスが必要です。FOnChange
なんで?
誰が私のFOnChange
ハンドラ変数をジャンクで上書きしているのかを突き止めようとしています。
私はコードをステップ実行しています:
if Assigned(FOnChange) then
FOnChange(Self);
イベント ハンドラーが割り当てられることはなく、しばらくの間、FOnChange
変数はnil
ウォッチ ウィンドウに表示されます。
@FOnChange: nil
Addr(FOnChange): nil
しかし、後でFOnChange
変数はがらくたに変わっています:
@FOnChange: $2C
Addr(FOnChange): $2C
FOnChange
だから私はCPUウィンドウのデータペインで変数を監視したいので、次のように監視できます:
00410018 00000000
に
00410018 0000002C
のアドレスがわからないことを除いてFOnChange
; 私はちょうど作った$410018
。
イベント変数のアドレスを見つけるにはどうすればよいですか?
私が試したこと
ウォッチリスト
OnChange: nil
@OnChange: nil
@@OnChange: Variable required
@FOnChange: nil
Assigned(OnChange): False
Assigned(FOnChange): False
@@FOnChange: $253B588
addr(addr(FOnChange)): $253B588
Alt+F5
- 変更時:
OnChange: TNotifyEvent $253B588
- FOnChange: 'FOnChange' の検査中にエラーが発生しました: 式エラー
- Self.FOnChange: 'Self.FOnChange' の検査中にエラーが発生しました: 式エラー
- @オンチェンジ:
@OnChange: Pointer $253B588
- @@OnChange : '@@OnChange' の検査中にエラーが発生しました: 式エラー
- @FOnChange :
@FOnChange: Pointer $253B588
- @@FOnChange :
@@FOnChange: ^Untyped (no address)
データ: @@FOnChange $253B588`
コンセンサスは住所にあるよう0x253B588
です。
しかし、サンプルコードを実行すると:
MyControl1.OnChange := TheOnChangeHandler;
それは次のようになります。
mov edx,[ebp+$08] ;move stack variable $08 into edx
mov [eax+$00000208],edx ;and then into offset $208 of my control
mov edx,[ebp+$0c] ;move stack variable $0c into edx
mov [eax+$0000020c],edx ;and then into offset $20c of my control
の住所が見つからないのも不思議ではありませんFOnChange
。2 つの住所です。