Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2007, 16:02   #1
Wolfheart
Любитель
Пользователь
 
Регистрация: 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;

Пожалуйста, объясните что именно происходит в ассемблерных вставках, дабы я смог понять как это работает.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
Wolfheart вне форума Ответить с цитированием
Старый 29.05.2007, 20:13   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

наверно происходит заполнение какой-то структуры
rpy3uH вне форума Ответить с цитированием
Старый 29.05.2007, 22:46   #3
Wolfheart
Любитель
Пользователь
 
Регистрация: 29.05.2007
Сообщений: 16
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
наверно происходит заполнение какой-то структуры
Н-да, это очевидно.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
Wolfheart вне форума Ответить с цитированием
Старый 30.05.2007, 20:06   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

тогда в чём проблема?
rpy3uH вне форума Ответить с цитированием
Старый 30.05.2007, 22:42   #5
Wolfheart
Любитель
Пользователь
 
Регистрация: 29.05.2007
Сообщений: 16
По умолчанию

Проблема в том, что я не понимаю что именно там заполняется и как работает.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
Wolfheart вне форума Ответить с цитированием
Старый 31.05.2007, 20:09   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

как будто я пойму, давай класс TWindow (или как здесь любят говорить класс TWindow в студию)
наверно заполняются данные формы
rpy3uH вне форума Ответить с цитированием
Старый 31.05.2007, 22:47   #7
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Ну во первых у тебя 2 ошибки.
1. Зачем ты делаешь виртуальным процедуру WMCreate?
2. Почему деструктор класса не оверрайдится?

В ассемблерной вставле происходит следующее:
В регистр EAX помещается адрес класса
В регистр ECX адрес памяти который мы только что выделили
После чего в выделенную пямять пишется
1. Команда чтения адреса возврата со стека
2. Команда записи собственно адреса класса на стек (считай change)
3. Команда возврата оригинального адреса на стек
4. Адрес оригинального калбэка класса.

Что этим достигается (если считать что стек растет снизу вверх)
При вызове lpfnWndProc окна произойдет CALL по статическому адресу расположения WndCallback. Вместо него там будет храниться тот код, который я обяснил в верхних 4 пунктах. Произойдет перенаправление на оконный stdcall калбэк класса TLiteFrame
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 01.06.2007, 14:45   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Rouse_ респект =)
Думаю Wolfheart"у легче не стало.
И вообще, если
Цитата:
создаю программку на "чистом" WinAPI
, то какого там делает TWindow?
пыщь
JTG вне форума Ответить с цитированием
Старый 01.06.2007, 20:34   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Думаю Wolfheart"у легче не стало.
почему, ему надо было только узнать, что делает ассемблерная вставка
rpy3uH вне форума Ответить с цитированием
Старый 02.06.2007, 01:14   #10
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Rouse_ респект =)
Думаю Wolfheart"у легче не стало.
И вообще, если , то какого там делает TWindow?
А это обычный класс, не VCL-ный, врапер (как их обычно называют)... бо кому придет писать в голову напрямую на апях, так и до ассемблера недалеко испортиться
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-серверное приложение: Callback MaTBeu Общие вопросы C/C++ 13 02.06.2008 20:27