如何获取保存事件处理程序的变量的地址?
例如
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:
@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
,是两个地址!