Как получить адрес переменной, содержащей обработчик события?
, например
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
в области данных окна ЦП, чтобы я мог просматривать ее с:
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: 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
, это два адреса!