Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизMessages Найти похожие ветки
← →
Домарощинер (2004-02-09 15:04) [0]Объясните построчно на пальцах, что значит этот код?
procedure TObject.Dispatch(var Message);
asm
PUSH ESI
MOV SI,[EDX]
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX
MOV EAX,[EAX]
CALL GetDynaMethod
POP EAX
JE @@default
MOV ECX,ESI
POP ESI
JMP ECX
@@default:
POP ESI
MOV ECX,[EAX]
JMP dword ptr [ECX].vmtDefaultHandler
end;
← →
Dimman1 (2004-02-09 15:11) [1]PUSH ESI ;положить в стек ESI
MOV SI,[EDX] ;в si - слово по адресу из EDX
OR SI,SI ; сравнение по ИЛИ si с самим собой
JE @@default ; если равно, то переход на default
CMP SI,0C000H ; сравниваем si c $0C000
JAE @@default ; сли больше или рано, то на default
PUSH EAX ; eax - в стек (как параметр наверное к функции GetDynaMethod)
MOV EAX,[EAX] ; в eax DWORD из адреса, на который она показывает
CALL GetDynaMethod ; вызов функции GetDynaMethod
POP EAX ; из стека в EAX - видать результат GetDynaMethod
JE @@default ; если флаг равенства установлен, то на default
ну и дальше в таком духе ;)
← →
MBo (2004-02-09 15:11) [2]Ну построчно долго, а вкратце - вызывается динамический метод объекта, адрес которого (Self) передается процедуре в EAX, а адрес структуры-сообщения (var Message)- в EDX
← →
Digitman (2004-02-09 16:38) [3]
> Объясните построчно на пальцах
а на кой шут тебе это нужно ?
ты хочешь понять зачем нужен этот метод и как его применять ? или что ?
← →
Mystic (2004-02-09 16:42) [4]Надо сказать спасибо, мог бы System.pas, SysUtils, Classes и Controls выложить...
← →
DiamondShark (2004-02-09 17:50) [5]procedure TObject.Dispatch(var Message);
asm
;На входе
; EAX - self
; EDX - @Message
PUSH ESI ;так нада
MOV SI,[EDX] ;первое поле в записи Message
;код сообщения.
;Он будет использован как индекс обработчика
; проверка диапазона
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX ;типа, сохранили
MOV EAX,[EAX] ;в EAX теперь адрес VMT
CALL GetDynaMethod ;получить адрес dynamic метода
;по индексу. С раскруткой по предкам
POP EAX ;восстановили self
JE @@default ;если метод не найден
MOV ECX,ESI ;адрес метода
POP ESI ;восстановили ESI
JMP ECX ;пошли к обработчику
;метод не найден либо индекс вне допустимого диапазона
@@default:
POP ESI ;восстановили ESI
MOV ECX,[EAX] ;в ECX адрес VMT
;пошли в self.DefaultHandler
JMP dword ptr [ECX].vmtDefaultHandler
end;
← →
Домарощинер (2004-02-10 18:06) [6]2DiamondShark © (09.02.04 17:50) [5]
Супер!
Моё почтение!
Это именно то, что нужно.
А то вот садиться за изучение асма пока не созрел... хотя понимаю, что надо...)
2Mystic © (09.02.04 16:42) [4]
если не хочешь, чтоб я это сделал, объясни на пальцах, как работают сообщения на низком уровне в виндах и как они непосредственно реализованы в Делфях.
Буду очень признателен.%)
← →
Игорь Шевченко (2004-02-10 18:09) [7]
> объясни на пальцах, как работают сообщения на низком уровне
> в виндах
Очень просто - кто-то посылает, кто-то принимает. Дядюшка Джеффри Рихтер очень популярно объясняет. Скачать можно на www.podgoretsky.com
← →
vuk (2004-02-10 18:13) [8]to Домарощинер:
>как они непосредственно реализованы в Делфях
Непосредственно в VCL обработка сообщений сделана через message методы. По сути это динамические методы, у которых индекс равен коду обрабатываемого сообщения. Для обычных динамических методоа этот индекс генерируется компилятором и явно задан быть не может.
← →
Alex Konshin (2004-02-10 23:16) [9]DiamondShark © (09.02.04 17:50) [5]
Просили же на пальцах, а я как ни искал, так ни одного "в натуре" и не нашел :-(.
:)
← →
Домарощинер (2004-02-11 13:33) [10]2Игорь Шевченко © (10.02.04 18:09) [7]
Имеется такой дядюшка. Даже хотелось его распечатать и почитывать перед сном, но потом пришёл к выводу, что для начала неплохо бы изучить ц/ц++...воизбежание%)
2vuk © (10.02.04 18:13) [8]
> Для обычных динамических методоа этот индекс генерируется
> компилятором и явно задан быть не может.
А для каких методов этот индекс можно задать явно?
2Alex Konshin © (10.02.04 23:16) [9]
Неизвестная распальцовка?;о)
← →
Игорь Шевченко (2004-02-11 13:45) [11]
> А для каких методов этот индекс можно задать явно?
Для сообщений. Директивой message Имя_сообщения
← →
DiamondShark (2004-02-11 15:42) [12]
> Alex Konshin © (10.02.04 23:16) [9]
Зато там было "типа" ;-)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c