Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 29.05.2007, 16:02   #1
Wolfheart
Любитель
Пользователь
 
Регистрация: 29.05.2007
Адрес: Киев
Сообщений: 16
Репутация: 50
По умолчанию 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,807
Репутация: 1974
По умолчанию

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

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

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

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

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

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

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

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

icq: III 37373860
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


17:53.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru