|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.05.2007, 16:02 | #1 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
Callback
Здравствуйте.
Сейчас работаю над одной вещью, создаю программку на "чистом" WinAPI и в процессе работы появилась необходимость "тесно сотрудничать" с Callback. С тривиальным вариантом case Msg of WM_CREATE : ... ; end; всё в порядке, однако мне больше подходит тот вариант, что реализован в библиотеке WinLite. Объясняю. Есть класс: type TWindow = class (TObject) private procedure WMCreate (var aMsg : TWMCreate); message WM_CREATE; virtual; public constructor Create (AWnd : THandle); virtual; destructor Destroy; end; Другими словами, при приёме сообщений вызывается предопределённая функция. Автор WinLite сделал возможным такую вещь с помощью ассемблера: constructor TWindow.Create(AWndParent: THandle); begin inherited Create; FWndParent := AWndParent; FWndCallback := VirtualAlloc(nil, 12, MEM_RESERVE OR MEM_COMMIT, PAGE_EXECUTE_READWRITE); asm mov EAX, Self mov ECX, [EAX].TLiteFrame.FWndCallback mov word ptr [ECX+0], $6858 mov dword ptr [ECX+2], EAX mov word ptr [ECX+6], $E950 mov EAX, OFFSET(TLiteFrame.WindowCallback) sub EAX, ECX sub EAX, 12 mov dword ptr [ECX+8], EAX end; end; Пожалуйста, объясните что именно происходит в ассемблерных вставках, дабы я смог понять как это работает.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
29.05.2007, 20:13 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
наверно происходит заполнение какой-то структуры
|
29.05.2007, 22:46 | #3 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
30.05.2007, 20:06 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
тогда в чём проблема?
|
30.05.2007, 22:42 | #5 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
Проблема в том, что я не понимаю что именно там заполняется и как работает.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
31.05.2007, 20:09 | #6 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
как будто я пойму, давай класс TWindow (или как здесь любят говорить класс TWindow в студию)
наверно заполняются данные формы |
31.05.2007, 22:47 | #7 |
Пользователь
Регистрация: 31.05.2007
Сообщений: 56
|
Ну во первых у тебя 2 ошибки.
1. Зачем ты делаешь виртуальным процедуру WMCreate? 2. Почему деструктор класса не оверрайдится? В ассемблерной вставле происходит следующее: В регистр EAX помещается адрес класса В регистр ECX адрес памяти который мы только что выделили После чего в выделенную пямять пишется 1. Команда чтения адреса возврата со стека 2. Команда записи собственно адреса класса на стек (считай change) 3. Команда возврата оригинального адреса на стек 4. Адрес оригинального калбэка класса. Что этим достигается (если считать что стек растет снизу вверх) При вызове lpfnWndProc окна произойдет CALL по статическому адресу расположения WndCallback. Вместо него там будет храниться тот код, который я обяснил в верхних 4 пунктах. Произойдет перенаправление на оконный stdcall калбэк класса TLiteFrame |
01.06.2007, 14:45 | #8 | |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
Rouse_ респект =)
Думаю Wolfheart"у легче не стало. И вообще, если Цитата:
пыщь
|
|
01.06.2007, 20:34 | #9 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
почему, ему надо было только узнать, что делает ассемблерная вставка
|
02.06.2007, 01:14 | #10 |
Пользователь
Регистрация: 31.05.2007
Сообщений: 56
|
А это обычный класс, не VCL-ный, врапер (как их обычно называют)... бо кому придет писать в голову напрямую на апях, так и до ассемблера недалеко испортиться
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Клиент-серверное приложение: Callback | MaTBeu | Общие вопросы C/C++ | 13 | 02.06.2008 20:27 |