当前位置 : 主页 > 编程语言 > delphi >

Delphi:如何获取事件变量的地址?

来源:互联网 收集:自由互联 发布时间:2021-06-23
如何获取持有事件处理程序的变量的地址? 例如 TExample = class(TObject)private FOnChange: TNotifyEvent;end; 我想要FOnChange私有成员,事件处理程序,变量的地址. 为什么? 我试图找出谁用垃圾覆盖我
如何获取持有事件处理程序的变量的地址?

例如

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

所以我想在CPU窗口的数据窗格中观察FOnChange变量,以便我可以从以下位置观察:

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:OnChange:TNotifyEvent $253B588
> FOnChange:检查’FOnChange’时出错:表达式错误
> Self.FOnChange:检查’Self.FOnChange’时出错:表达式错误
> @OnChange:@OnChange:指针$253B588
> @@ OnChange:检查’@@ OnChange’时出错:表达式错误
> @FOnChange:@FOnChange:指针$253B588
> @@ FOnChange:@@ FOnChange:^无类型(无地址)数据:@@ 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的地址,这是两个地址!

您可以通过Debug Inspector获取地址.要获取字段的地址,请在更改发生之前的某个时刻在代码中放置断点,例如在调用构造函数之后.然后在Debug Inspector中打开您的对象.不确定如何使用旧的IDE样式,但在D2010中,您可以从Run-> Inspect …菜单命令,Evaluate / Modify中的按钮,或通过键盘上的ALT-F5获取. (小心你不要打ALT-F4!)

Debug Inspector将向您显示包含其所有字段的对象.双击其中一个字段,它将在新的Debug Inspector窗口中打开.在顶部的编辑框状栏中将是您的字段的地址.您可以使用它来设置内存断点以查找值更改的位置.

网友评论