Листинг 16.16. Фрагменты приложения
- программа, демонстрирующая
обработчик события.
db "Нажаты CTRL+C"
Text BREAK db "Нажаты CTRL+BREAK"
продолжение
444 Глава
Создание Windows-приложений на ассемблере
(продолжение)
. code
CtrlHandler proc
arg
uses
esi ;эти регистры обязательно должны сохраняться
тип сигнала управления
je h_CTRL_C_EVENT
cmp
je
h_default
нажатии
выводим сообщение:
установим курсор
call
вывести строку
call
возвращаем признак обработки
mov
1
jmp
нажатии
выводим сообщение:
установим курсор
call
вывести строку
call
возвращаем признак обработки
mov
jmp
mov eax
-1
;все остальное не обрабатываем
ret
CtrlHandler endp
start proc near ;точка входа в программу:
. . .
стандартные дескрипторы ввода-вывода
;установим функцию-обработчик сигналов управления
push TRUE
push offset cs: CtrlHandler
call SetConsoleCtrlHandler
cmp
eax, 0
jz exit ;если неуспех
введем строку в буфер TitleText
установим курсор в позицию (2,6)
call
call ReadConsoleA
выведем введенную строку в заголовок окна консоли:
push offset TitleText
call
выведем строку в окно консоли с различных позиций и с разными цветами
mov
выведем 10 раз
mov bl,10000001b
атрибуты
Программирование консольных Windows-приложений 445
ml: push ecx
курсор в позицию
call
атрибуты выводимых символов:
;будем получать их циклически - сдвигом регистра
push eax
push
call SetConsoleTextAttribute
вывести строку TitleText
call
jz exit ;если неуспех
pop ecx
loop ml
Относительно этой программы можно сделать два замечания. Первое касается
функции
которая в нашей программе называется CtrlHandler. Как
упоминалось, эта функция является функцией обратного вызова. Она вызывается
при возникновении определенных событий неявно — из системы Windows. По
структуре и алгоритму работы она аналогична оконной функции, которую мы рас-
сматривали ранее (см. раздел «Каркасное Windows-приложение на
По-
этому за всеми подробностями отсылаем читателя к этому материалу. Второе за-
мечание касается порядка отладки приложений, содержащих определяемые
пользователем функции (процедуры) обратного вызова. Первое, что нужно сде-
лать в процессе пошагового выполнения программы в отладчике, — выяснить ад-
рес процедуры обратного вызова. В программе из листинга 16.16 это можно сде-
лать, выяснив, какое значение будет помещено в стек при выполнении команд:
функцию-обработчик сигналов управления
push TRUE
push offset
CtrlHandler
call SetConsoleCtrlHandler
cmp
e a x ,
0
jz exit ;если неуспех
После этого, сделав активным окно CPU отладчика (выбрав в меню команду
View CPU), необходимо установить указатель мыши в окно с командами процес-
сора и щелкнуть правой кнопкой мыши. В появившемся контекстном меню выбе-
рите пункт Goto. В результате этих действий отладчик отобразит окно диалога,
в которое необходимо внести адрес программы-обработчика CtrlHandler. После этого
в верхней части окна команд отобразится первая команда процедуры CtrlHandler.
Установите на нее курсор и нажмите клавишу F4. Программа начнет выполняться
по своему алгоритму. При нажатии пользователем управляющих комбинаций кла-
виш, допустимых функцией HandlerRoutine, управление будет передано этой функ-
ции, и вы сможете произвести ее отладку.
Низкий уровень консольного ввода-вывода по сравнению с высоким обладает
более широкими и гибкими возможностями. Низкоуровневые функции консоль-
446 Глава
Создание Windows-приложений на ассемблере
ного ввода-вывода обеспечивают прямой доступ к входному и экранным буферам
консоли, предоставляя приложению доступ к событиям мыши и клавиатуры, а так-
же к информации об изменении размеров окна консоли. Функции низкоуров-
невого ввода-вывода позволяют приложению иметь доступ по чтению-записи
к указанному числу последовательных символьных ячеек в экранном буфере
или к прямоугольному блоку символьных ячеек в указанной позиции экран-
ного буфера.
Итоги
Разработка Windows-приложения на языке ассемблера — вполне реальное и в
ряде случаев оправданное дело. Однако несмотря на имеющиеся в TASM
и MASM средства, для создания полноценного Windows-приложения требу-
ются дополнительные программные и информационные ресурсы, предостав-
ляемые пакетами языков высокого уровня. Лучше всего для этой цели подходит
пакет VC++ версии 6.0 и выше. Основную ценность в нем имеют включаемые
файлы, редактор ресурсов, работающий в составе интегрированной среды раз-
работки, и компилятор ресурсов. Интерес могут представлять также различ-
ные утилиты, входящие в состав пакета Visual C++, например Spy++.
и Приступать к разработке приложения для системы Windows на ассемблере луч-
ше всего, имея некоторый опыт разработки приложений на языке высокого уров-
ня. Это необходимо для понимания логики работы приложения. Когда пони-
мание логики работы Windows-приложения достигнуто, выбор языка для его
реализации приобретает в
степени техническое значение и определя-
ется постановкой задачи и предполагаемыми условиями ее
• Благодаря поддержке системой Windows консольных приложений можно ма-
лыми силами решать серьезные задачи, в том числе и по администрированию
системы. Консольным приложениям доступны практически все возможности,
предоставляемые Win32 API, при этом для построения приложений не требу-
ется реализовывать какие-то изощренные схемы.
Do'stlaringiz bilan baham: |