Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-6226
iNew
2004-02-12 05:30
2004.03.03
Утилита SHUTDOWN.EXE из resource kit.


11-6003
EAccessViolation
2003-05-22 09:36
2004.03.03
КАК НАПИСАТЬ MDI Application & KOL?


4-6267
LameFox
2003-12-26 16:38
2004.03.03
Оформление в Windows 2000 как в Windows XP


1-6142
WebErr
2004-02-19 15:34
2004.03.03
А в Delphi есть template?


14-6198
Manulo
2004-02-11 16:12
2004.03.03
вирус = пиво :)