|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Получить адрес объекта из метода класса
Код:
TMyClass = class public constructor Create; destructor Destroy; override; end; destructor TMyClass.Destroy; begin Showmessage(Integer(@Self)); Inherited Destroy; end; Код:
var Obj: TMyClass; begin Obj := TMyClass.Create; Showmessage(Integer(@Obj)); Obj.Free; end; Получаю разные значения @Self и @Obj, а мне нужно, чтобы в методе Destroy узнать @Obj. Как это сделать? Почитал тут http://stackoverflow.com/questions/3...-pointer-usage , но ничего не понял. Последний раз редактировалось ART, 11.11.2012 в 16:44. |
#2
|
||||
|
||||
Цитата:
Код:
ShowMessage(IntToStr(Integer(Self))); // В первом случае ShowMessage(IntToStr(Integer(Obj))); // Во втором случае |
#3
|
||||
|
||||
[asm]
lea eax, obj mov eax, [eax] [/asm] — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
||||
|
||||
Цитата:
p.s. Ещё одно замечание: На Win64 тип Integer остался 32-битным, а Pointer стал 64-битным. Поэтому под Win64 нельзя преобразовывать указатели к типу Integer. |
#5
|
|||
|
|||
Так есть ли возможность мне в destroy узнать именно @Obj ?
|
#6
|
||||
|
||||
Цитата:
|
#7
|
||||
|
||||
Цитата:
Код:
var object: pointer; ... Destroy(object); ; ------------------- mov ecx, [object] push ecx ; пусть будет stdcall, в данном случае не важно call Destroy Код:
mov ecx, obj Аналогия: в первом случае мы взяли книгу с полки и отнесли ее другу. Он никак не сможет узнать, где эта книга стояла ранее (без посторонней помощи). Во втором случае мы сказали другу: "книга на такой-то полке, возьми сам". В деструктор передается первым способом. jmp $ ; Happy End! The Cake Is A Lie. |