<<
>>

Пример программы консольного ввода-вывода

Для демонстрации функций высокоуровневого ввода-вывода в окно консоли раз- работаем программу, которая вводит с клавиатуры строку и отображает ее в заго- ловке окна консоли, а затем выводит эту строку в окне консоли с изменением те- кущей позиции курсора и цвета текста (листинг 16.15).
Листинг 16.15. Фрагменты приложения рrg16_6.аsm ,рrgl6_6.аsm - программа консольного ввода-вывода ;с изменением атрибутов выводимого текста
. data
. code start proc near
;точка входа в программу:

Листинг 16.15 (продолжение) сmр еах,О jz exit ;еспи неуспех pop ecx loopml exit: :выход из приложения Каждый консольный процесс имеет собственный список функций-обработчи- ков, которые вызываются системой, когда происходят определенные события, на- пример, при активном окне консоли пользователь нажимает комбинацию клавиш Сtrl+С, Сtrl+Вrеаk или Сtrl+Сlоsе. При запуске консольного приложения список функ- ций-обработчиков содержит только заданную по умолчанию функцию, которая вызывает функцию ExitProcess.

Консольный процесс может добавлять или уда- лять дополнительные функции-обработчики, вызывая функцию SеtСопsоlеСtrL- Handler: ВООL SеtСопsоlеСtrlНапdlеr(РНАNDLЕR_RОUТINЕ НапdtеrRоutiпе , BOOL Add): Данная функция имеет два параметра: it HandlerRoutine — указатель на определенную приложением функцию Handler- Routine, которая должна быть добавлена или удалена; Ш Add — логическое значение: ? 1 — функция должна быть добавлена; ? 0 — функцию необходимо удалить. Функция HandlerRoutine — это определенная приложением функция обратного вызова. Консольный процесс использует эту функцию, чтобы обработать нажатия клавиш управления. На самом деле HandlerRoutine — идентификатор-заполнитель для определенного приложением имени функции: BOOL WINАРI НапdtеrRоutiпе(DWОRD dwСtrtТуре): Параметр DwCtrlType определяет тип сигнала управления, получаемого обработ- чиком. Этот параметр может принимать одно из следующих значений: К CTRL_C_EVENT = 0 — сигнал, имитирующий нажатие клавиш Сtrl+С, может быть получен из двух источников: с клавиатуры или от функции GenerateConsole- CtrlEvent; 9 CTRL_BREAK_EVENT = 1 — сигнал, имитирующий нажатие клавиш Ctrl+Break, мо- жет быть получен из двух источников: с клавиатуры или от функции Generate- СопsоlеСtrlЕvепt; Ш CTRL_CLOSE_EVENT = 2 — сигнал, который система посылает всем процессам, под- ключенным к данному консольному приложению, когда пользователь его за- крывает (выбирая пункт Close в системном меню окна консоли или щелкая на кнопке завершения задачи в диалоговом окне Менеджера задач); * стrl_lоgоff_еvеnт= 5 — сигнал, который посылается всем консольным процес- сам, когда пользователь завершает работу в системе (этот сигнал не указывает, какой именно пользователь завершает работу); ii CTRL_SHUTDOWN_EVENT = б — сигнал, который система посылает всем консоль- ным процессам при подготовке к выключению машины. Функция НапdlеrRоutiпе должна возвратить логическое значение: 1 — если она обрабатывает конкретный сигнал управления; 0 — для обработки полученного со- бытия будет использоваться другая функция-обработчик HandlerRoutine из списка функций-обработчиков этого процесса (то есть включенная в этот список раньше данной функции).
Как уже было упомянуто, каждый консольный процесс может определить не- сколько функций HandlerRoutine, которые связываются в цепочку. Первоначально этот список содержит только заданную по умолчанию функцию-обработчик, вы- зывающую функцию ЕхitРrосеss, что в результате приводит к завершению текуще- го консольного приложения. Консольный процесс добавляет или удаляет допол- нительные функции-обработчики, вызывая функцию SеtСопsоLеСtrLНапdlеr, которая не затрагивает список функций-обработчиков других процессов. Когда консоль- ный процесс принимает любой из сигналов управления (см. выше), то вызывается последняя зарегистрированная функция-обработчик, если она не возвращает 1, то управление передается следующему (предыдущему) зарегистрированному обра- ботчику и так продолжается до тех пор, пока один из обработчиков не возвратит 1. Если ни один из обработчиков этого не сделал, то вызывается обработчик, задан- ный по умолчанию. Установка обработчиков для сигналов CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT дает процессу возможность выполнить специфичные для него действия по корректному завершению приложения. Пользовательская функ- ция HandlerRoutine может быть вызвана для того, чтобы выполнить следующие дей- ствия: і` вызвать функцию ExitProcess для завершения процесса; ® возвратить 0 (ложь) — это означает, что завершение приложения должен вы- полнить обработчик, заданный по умолчанию; ™ возвратить 1 — в этом случае никакие другие функции-обработчики не вызы- ваются, и система отображает модальное окно диалога с запросом о необходи- мости завершения процесса. В последнем случае система также отображает окно диалога, если процесс не отвечает определенное время (5 секунд для CTRL_CLOSE_EVENT и 20 секунд для CTRL LOGOFF EVENT и CTRL_SHUTDOWN_EVENT). Процесс может использовать функ- цию SеtРrосеssShutdоwпРаrаmеtеrs, чтобы запретить системе отображать окно диа- лога. В этом случае система просто заканчивает процесс, когда HandlerRoutine воз- вращает истину или когда истекает определенный период времени.
В листинге 16.16 приведен пример пользовательского обработчика события — ввода комбинации Сtrl+С или Сtrl+Вrеаk. За основу взята предыдущая программа. Листинг 16.16. Фрагменты приложения рrg16_7.аsm ;рrglб_7.asm - программа, демонстрирующая пользовательский обработчик события. . data Техt_СТRL_С db "Нажаты СTRL+С" Lел_Техt_СТRL=$-Техt_СТRL_С Text BREAK db "Нажаты СTRL+ВRЕАK" _ продолжение iУ Листинг 16.16 (продолжение) Lеп_ВRЕАК=$-Техt_ВRЕАК . code СtrlНапdlеr рrос аrg @@dwСtrlТуре:DWORD uses еbх,еdi, еsi ;эти регистры обязательно должны сохраняться ;анализируем тип сигнала управления сmр @(5>dwСtrlТуре,СТRL_С_ЕVЕNТ jе h_СТRL_С_ЕVЕNТ сmр @@dwСtrlТуре , СТRL_ВRЕАК_ЕVЕNТ jе h_СТRL_ВRЕАК_ЕVЕNТ . jmр h_dеfаult h_СТRL_С_ЕVЕNТ: ;при нажатии СТRL+С выводим сообщение: ;установим курсор call SetConsoleCursorPosition ;вывести строку Техt_СТRL_С call WritеСопsоlеА :возвращаем признак обработки mоv еах.1 jmр ехit_СtrLНапdlеr h_СТRL_ВRЕАК_ЕVЕNТ: ;при нажатии СТRL+ВRЕАК выводим сообщение: [установим курсор call SetConsoleCursorPosition [вывести строку call WritеСопsоlеА [возвращаем признак обработки mоv еах,l jmр ехit_СtrLНапdlеr h_dеfаult: mоv еах ,0ffffffffh [возвращаем -1 ;все остальное не обрабатываем ехit_СtrLНапdlеr: rеt CtrlHandlerendp start рrос near ;точка входа в программу: ;работаем . . . ;получим стандартные дескрипторы ввода-вывода ;установим функцию-обработчик сигналов управления push TRUE push offset cs: CtrlHandler call SetConsoleCtrlHandler cmp eax, 0 ■ jz exit ;если неуспех :введем строку в буфер TitleText [установим курсор в позицию (2,6) call SetConsoleCursorPosition " call ReadConsoleA :выведем введенную строку в заголовок окна консоли: push offset TitleText call SetConsoleTitleA ; выведем строку в окно консоли с различных позищии и с разными щветами mоv есх,10 [строку выведем 10 раз mоv ЫДООООООlb [начальные атрибуты ' ml: push ecx ;установим курсор в позицию call SetConsoleCursorPosition •.определим атрибуты выводимых символов: ;будем получатв их циклически - сдвигом регистра ВL хоr еах,еах rоl Ы. 1 mоv аl,Ы push еах push dОut call SetConsoleTextAttribute ;вывести строку TitleText call WritеСопsоlеА сmр еах,0 jz exit ;если неуспех pop ecx loop ml Относительно этой программы можно сделать два замечания. Первое касается функции НапdlеrRоutiпе, которая в нашей программе называется CtrlHandler. Как упоминалось, эта функция является функцией обратного вызова. Она вызывается при возникновении определенных событий неявно — из системы Windows. По структуре и алгоритму работы она аналогична оконной функции, которую мы рас- сматривали ранее (см. раздел «Каркасное Windows-приложение на C/C++»). По- этому за всеми подробностями отсылаем читателя к этому материалу. Второе за- мечание касается порядка отладки приложений, содержащих определяемые пользователем функции (процедуры) обратного вызова. Первое, что нужно сде- лать в процессе пошагового выполнения программы в отладчике, — выяснить ад- рес процедуры обратного вызова. В программе из листинга 16.16 это можно сде- лать, выяснив, какое значение будет помещено в стек при выполнении команд: ;установим функцию-обработчик сигналов управления push TRUE push offset cs: CtrlHandler call SetConsoleCtrlHandler cmp eax, 0 jz exit ;если неуспех После этого, сделав активным окно CPU отладчика (выбрав в меню команду View ► CPU), необходимо установить указатель мыши в окно с командами процес- сора и щелкнуть правой кнопкой мыши. В появившемся контекстном меню выбе- рите пункт Goto. В результате этих действий отладчик отобразит окно диалога, в которое необходимо внести адрес программы-обработчика CtrlHandler. После этого в верхней части окна команд отобразится первая команда процедуры CtrlHandler. Установите на нее курсор и нажмите клавишу F4. Программа начнет выполняться по своему алгоритму. При нажатии пользователем управляющих комбинаций кла- виш, допустимых функцией Handler Routine, управление будет передано этой функ- ции, и вы сможете произвести ее отладку. Низкий уровень консольного ввода-вывода по сравнению с высоким обладает более широкими и гибкими возможностями. Низкоуровневые функции консоль- ного ввода-вывода обеспечивают прямой доступ к входному и экранным буферам консоли, предоставляя приложению доступ к событиям мыши и клавиатуры, а так- же к информации об изменении размеров окна консоли. Функции низкоуров- невого ввода-вывода позволяют приложению иметь доступ по чтению-записи к указанному числу последовательных символьных ячеек в экранном буфере или к прямоугольному блоку символьных ячеек в указанной позиции экран- ного буфера.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Пример программы консольного ввода-вывода:

  1. Примеры жестокости по отношению к другим (эти примеры более всего относятся к семейной жизни):
  2. Программа Да и программа Нет
  3. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  4. § 37 История вотчинной записки в России. – Явка актов в приказах. – Справка. – Юридическое и финансовое ее значение. – Аналогия нашей формы с западными. – Изменение старой формы при Петре I. – Новый крепостной порядок и новое значение справки и отказа. – Форма нового отказа и ввода во владение
  5. Г л а в а 9 О ПРОГРАММАХ
  6. Выводы
  7. Музыкальные концертные программы
  8. Выводы
  9. Первый запуск программы
  10. 2.4.3. Выводы
  11. Выводы
  12. Выводы
  13. ИЗНАЧАЛЬНО КОРОТКАЯ ПРОГРАММА
  14. Выводы
  15. Выводы
  16. 7. Выводы, основанные на эмоциях
  17. 2. Общий вывод из единичных фактов
  18. 3.1.4. Выводы