|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 29, 2004 16:16:10 Доброго здоровья, пишет ищущий чайник. Изучая урок 4 Iczelion'a, задался вопросом Куда возвращает команда RET из WndProc Процедуру окна сама прога не вызывает, это понятно, но логично предположить, что после обработки сообщения, прого должна вернуться в цикл сообщений. Вопрос как в win32 это происходит, и как в айсе это увидеть. |
|
|
Дата: Авг 29, 2004 17:55:24 Прога вызывает процедуру окна неявно через DispatchMessage |
|
|
Дата: Авг 29, 2004 20:13:02 [ Bitfry: и как в айсе это увидеть. ] Добавь int 3 в любое место своей WndProc. В айсе набери i3here on. Когда трапнешься набери p ret и ты в сабже. |
|
|
Дата: Авг 29, 2004 22:27:55 [Прога вызывает процедуру окна неявно через DispatchMessage] Loger я это понимаю, я так же понимаю, что и без DispatchMessage может вызваться процедура окна. Я не очень понимаю, что происходит после этой процедуры. Команда ret кидает меня в user32, и даже если я буду выполнять код в айсе дальше, я не попаду в цикл сообщений, почему? [Добавь int 3 в любое место своей WndProc. В айсе набери i3here on. Когда трапнешься набери p ret и ты в сабже.] Four-F у меня не работает или я что делаю не так. Насколько я понял нужно выполнить следующее: В код программы в WndProc добавить строку int 3 Вызвать айс и набрать i3here on Запустить прогу и трапнуца Набрать в айсе p ret И вот здесь айс должен оказаться в сабже. Только он оказываюсь в том же user32 А за сабж я принимаю цикл сообщений, или я неправ? |
|
|
Дата: Авг 29, 2004 23:22:18 · Поправил: leo Bitfry "А за сабж я принимаю цикл сообщений" Насколько я понимаю, тебе нужен call stack - цепочка вызовов. В айсе call stack вызывается комадой STACK (подробности в Command Reference). Если под циклом сообщенний имеется ввиду обработка сообщений в дебажном процессе, то в итоге ты должен попасть в PeekMessage или GetMessage дебажного процесса, а из них в message loop. Поэтому после трапа на int3 смотрим call stack и откуда идет вызов PeekMessage и т.п. |
|
|
Дата: Авг 30, 2004 03:09:51 Bitfry > И вот здесь айс должен оказаться в сабже. нажимай F12(p ret) несколько раз, пока не окажешься в адресном пространстве проги. |
|
|
Дата: Авг 30, 2004 10:31:23 · Поправил: leo Оычно цикл сообщений это: если не PeekMessage, то WaitMessage. Поэтому вместо int3 можно попробовать bpx WaitMessage. Затем смотришь адрес возврата в ESP. |
|
|
Дата: Авг 30, 2004 11:18:17 Leo, команда stack очень полезная, спасибо, буду пользоваться. [пока не окажешься в адресном пространстве проги.] Asterix, не окажусь я там. Через несколько p ret'ов айс больше не появляется. Да что вы меня путаете! Ставлю простой бряк на строку ret В айсе выполняю эпилог (leave и ret 0010) Прога в user32, и в стеке сверху лежит указатель начала цикла сообщений моей программы. Вот и все! Но суть не в этом, я не хочу возвратиться в цикл по всяким p ret'ам, я хочу понять, кто и где берет из стека этот указатель и возвращается в мой цикл сообщений за новой месагой. Блин, я скоро как программер буду изъясняться! :) |
|
|
Дата: Авг 30, 2004 11:30:40 [Прога в user32, и в стеке сверху лежит указатель начала цикла сообщений моей программы.] Наврал! Там не указатель цикла сообщений. Там указатель WndProc, но почему? |
|
|
Дата: Авг 30, 2004 13:16:09 Сообщения виндоса - штука довольно муторная. Помимо DispatchMessage, многие другие функции (например DefWindowProc, GetClientRect и т.п.) так же могут вызывать WndProc. т.е. вызов происходит непосредственно из WndProc рекурсивно, может по многу раз. По RET из WindProc (в XP по крайней маре) попадаем в user32 на cmp [dword ss:esp+4], DCBAABCD так виндос заботится о тех, кто использует RETN, вместо RETN 10h. Ещё поищите Джеффри Рихтер "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows", там про сообщения есть целая глава. Ссылки на такие вещи запрещены, но поиск поможет ;-) |
|
|
Дата: Авг 30, 2004 13:35:05 S_T_A_S_ Вот это ответ так ответ, спасибо. Буду читать, оно у меня есть. Если чего не пойму, опять здесь спрашивать буду. Еще раз спасибо. |
|
|
Дата: Авг 30, 2004 14:27:29 [ Bitfry: Да что вы меня путаете! ] Так это не мы тебя, а ты нас :) Ты спросил "Куда возвращает команда RET из WndProc?". И я ответил именно на вопрос. А что ты там имел ввиду - пойди разбери. А Рихтера почитай. |
|
|
Дата: Авг 30, 2004 16:20:53 Four-F Да ты прав, я не ясно задал вопрос. Я не имел введу каманду айса. Вопрос был про опкод ret 0010 в конце WndProc в 4 уроке у Iczelion'a А книга дельная, я ее отложил, потому что название меня сбило, а вот сейчас читаю. |
|
|
Дата: Сен 1, 2004 11:38:49 Джеффри РИХТЕР "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" Цитата из главы 26 ... Алгоритм выборки сообщений из очереди потока Когда поток вызывает GetMessage или PeekMessage, система проверяет флаги состояния очередей потока и определяет, какое сообщение надо обработать 1. Если флаг QS_SENDMESSAGE установлен, система отправляет сообщение соответствующей оконной процедуре GetMessage и PeekMessage контролируют процесс обработки и не передают управление потоку сразу после того, как оконная процедура обработает сообщение, вместо этого обе функции ждут следующего сообщения. 2. Если очередь асинхронных сообщений потока не пуста, GetMessage и Peek Message заполняют переданную им структуру MSG и возвращают управление в Цикл выборки сообщений (расположенный в потоке) в этот момент обычно обращается к DispatchMessage, чтобы соответствующая оконная процедура обработала сообщение. 3. Если флаг QS_QUIT установлен, GetMessage и PeekMessage возвращают сообщение WM__QUIT (параметр wParam которого содержит указанный код заверше ния) и сбрасывают этот флаг. 4 Если в очереди виртуального ввода потока есть какие-то сообщения, GetMessage и PeekMessage возвращают сообщение, связанное с аппаратным вводом. 5. Если флаг QS_PAINT установлен, GetMessage и PeekMessage возвращают сооб щение WM_PAINT для соответствующего окна ... Если кто может, объясните, пожалуйста, в пункте 1, идет речь о том, куда прога попадет из WndProc? А вообще я не нашел в этой главе про сабж, только это. Может, есть еще дельные книги по архитектуре форточек? |
|
|
Дата: Сен 1, 2004 13:54:42 Дык я же написАл - из WndProc мы всегда будем попадать в user32, поскольку именно оттуда и происходит непосредственно вызов. Куда попадём дальше - вопрос неоднозначный, зависит от состояния очереди сообщений. Ты б написАл подробнее зачем это нужно, может тогда кто-нибудь и даст более вразумительный ответ. Досконального описания всего этого механизма imho нигде нет, т.к. он меняется с развитием виндоса. Например, до XP можно было обходиться без ф-ции DispatchMessage, самостоятельно вызывая WndProc. Можно ещё создать окна без цикла выборки сообщений. Или зарегистрировать DefWindowProc в качестве WndProc. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.092 |