Win32 в машинных кодах


Шаблон оконного приложения


В четвертой статье мы создали первый шаблон приложения, возможности которого потом постепенно наращивали. Сегодня важный момент: мы подошли к очередному рубежу. Наконец-то мы сможем создать полноценное работоспособное окно. Мы построим законченное приложение и сохраним его в качестве общего шаблона ("generic"), а затем будем проводить с ним эксперименты.

Для "доведения до ума" предыдущего приложения осталось уже совсем немного. Нужно реализовать возможность завершения цикла сообщений, обеспечить обработку сообщений по умолчанию и, наконец, дать возможность приложению закончить работу при закрытии окна.

Цикл сообщений завершается очень просто. На самом деле, функция GetMessageA возвращает значение 0, если получено сообщение с кодом 12h (WM_QUIT), и ненулевое значение для любого другого сообщения. Для отправки сообщения с кодом 12h служит функция PostQuitMessage (из модуля User32.dll), которая принимает единственный аргумент - код завершения приложения (при нормальном завершении обычно 0). Эту функцию можно вызвать при обработке другого сообщения от главного окна приложения - 2 (WM_DESTROY). В результате при закрытии окна приложение будет автоматически завершаться (на самом деле, просто выходить из цикла сообщений; но за ним традиционно стоит вызов функции ExitProcess. Любители кошмариков могут, конечно, вставить сюда переход в начало программы, чтобы создать "вечное" приложение, которое никак невозможно завершить).

Итак, в файле rdata.txt нужно восстановить функцию DefWindowProc, а также импортировать одну новую - PostQuitMessage. Но сначала изменим общую схему нашего приложения. Оставим больше места для последующих экспериментов; кроме того, минимизируем необходимость внесения в файлы правок в будущем и разместим структуры импорта "рыхлым" образом, с промежутками между ними (чтобы не править каждый раз смещения строк и таблиц). Размеры заголовка и секций в файлах сделаем по 400h (в памяти по-прежнему оставим 1000h - пока этого достаточно). С прицелом на будущее добавим также одну новую секцию ".rsrc" - для ресурсов (придется внести изменения в таблицу секций PE-заголовка). Т.о., макет будет следующим: заголовок (400h в файле, 1000h в памяти), секция кода ".code" по смещению 1000h в памяти и 400h в файле, затем секция данных импорта ".rdata" (2000h и 800h), секция данных ".data" (3000h и C00h), секция ресурсов (4000h и 1000h).




Начало  Назад  Вперед



Книжный магазин