Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Консоль



Консоль – это интерфейс, обеспечивающий работу программы в стиле MS DOS под управлением WINDOWS, то есть внешне экран при выводе на него информации или при вводе с клавиатуры похож на экран MS DOS, но приложение выполняется в защищенном режиме, и в нем можно пользоваться функциями API. Консоль включает в себя буфер ввода и один или несколько экранных буферов. Буфер ввода представляет собой очередь, каждая запись которой содержит информацию о событиях, связанных с вводом. Под этими событиями понимается нажатие и отпускание клавиш на клавиатуре и мыши, движение мыши, а также действия пользователя с окном. Экранный буфер – массив, содержащий коды символов и атрибуты символов текстового режима. Доступ к данным в этих структурах обеспечивается специальными функциями API.

Если какая-либо программа запускается из консоли, принадлежащей другой программе, то она использует родительскую консоль. Если же программа запускается из графической оболочки WINDOWS, то ей выделяется собственная консоль. Такого же эффекта при запуске консольного приложения из родительской консоли можно добиться, применив в консольном приложении последовательно функции API FreeConsole и AllocConsole.

Для доступа к символьной информации, попавшей в буфер ввода, может использоваться функция ReadConsoleA, посредством которой строка символов передается в массив, на который указывает один из параметров функции. Массив должен быть описан в сегменте данных приложения.

На экране отображается информация из активного экранного буфера. Можно, например, передать в буфер экрана строку символов с помощью функции WriteConsoleA, одним из параметров которой является указатель на массив, определенный в сегменте данных приложения. Буква А в конце имени функции означает, что функция использует кодировку ASCII. В качестве примера можно привести простую программу, которая при вводе отображает на экране символы, соответствующие нажатым клавишам, а при вводе “Enter” выводит эти символы строкой ниже. Результат работы программы приведен на Рис.1.15.

Текст программы 1:

.386

model flat,STDCALL

include wincon32.inc

extrn WriteConsoleA:PROC

extrn ReadConsoleA:PROC

extrn GetStdHandle:PROC

extrn ExitProcess:PROC

extrn FreeConsole:PROC

extrn AllocConsole:PROC

.data

num1 dd 0

num dd 80

num2 dd 0

buf_v db 80 dup (0)

.code

start: call FreeConsole

call AllocConsole

call GetStdHandle,STD_INPUT_HANDLE

;----------------------------------------------

push 0;резерв

push offset num1;число введеных символов

push num;макс. число ввод. симв.

push offset buf_v;адрес массива для записи символов

push eax;дескриптор стандартного ввода

call ReadConsoleA

;-----------------------------------------------

call GetStdHandle,STD_OUTPUT_HANDLE

;------------------------------------------------

call WriteConsoleA,eax,offset buf_v,num1,offset num2,0

;-------------------------------------------------

call GetStdHandle,STD_INPUT_HANDLE

call ReadConsoleA,eax,offset buf_v,num2,offset num1,0

call ExitProcess,0

end start

Рис.1.15. Результат работы программы 1 в окне консоли

Как видно из текста программы в ней принципиально необходима всего одна машинная команда CALL – вызов подпрограммы, а подпрограммами являются функции интерфейса прикладного программирования (API). Команды PUSH использованы для передачи параметров функции ReadConsoleA только для удобства описания этих параметров с помощью комментариев.

Для обращения к устройствам ввода-вывода необходимо получить их дескрипторы, что обеспечивается вызовом функции GetStdHandle.

Функция GetStdHandle предназначена для получения дескрипторов устройств стандартного ввода, вывода или устройства ошибки. В качестве параметра ей необходимо передать идентификатор потока – константу STD_INPUT_HANDLE, STD_OUTPUT_HANDLE или STD_ERROR_HANDLE. Константы имеют значения -10, -11 и -12 соответственно. Дескрипторы, возвращенные функцией GetStdHandle, могут использоваться любой из функций консоли, которые обращаются к вводу, экранному буферу, или функциями ReadFile и WriteFile. Дескрипторы стандартных потоков обеспечивают доступ GENERIC_READ и GENERIC_WRITE – для чтения и для записи.

Функция ReadConsoleA передает коды символов ASCII из буфера ввода в указанный массив и удаляет их из буфера ввода. Первым параметром функции является дескриптор ввода. Второй параметр – указатель на массив символов, в который будут записаны символы из буфера ввода. Третий параметр содержит максимальное число вводимых символов, четвертый – указатель на переменную, в которую будет записано число фактически введенных символов. Пятый параметр зарезервирован и должен быть равен нулю.

Функция WriteConsoleA выводит на экран символы ASCII из указанного буфера с текущей позиции курсора. Первым параметром функции является дескриптор вывода. Второй параметр – указатель на массив выводимых символов. Третий параметр содержит число выводимых символов, четвертый – указатель на переменную, в которую будет записано число фактически выведенных символов. Пятый параметр зарезервирован и должен быть равен нулю.

Второй вызов функции ReadConsoleA в нашем примере служит для того, чтобы можно было увидеть результат работы программы на экране.

Структура текста консольной программы не отличается от структуры программы режима реального адреса (программы, работающей под управлением MS DOS). В первой строке содержится директива, определяющая набор команд, которые будут использоваться далее. Директива model позволяет использовать далее упрощенное описание сегментов, определяет модель памяти и форму передачи параметров функциям API. Далее следует описание вешних по отношению к нашей программе модулей, включаемых в неё на стадии компиляции и компоновки. Затем следует описание сегмента данных и сегмента кода. В конце программы содержится вызов функции ExitProcess, которая относится к функциям API, управляющим работой приложения, и обеспечивает завершение приложения.





Дата публикования: 2015-10-09; Прочитано: 392 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...