Скачать презентацию Консольные приложения Лекция 8  План лекции Введение Скачать презентацию Консольные приложения Лекция 8 План лекции Введение

8. Консольные приложения.ppt

  • Количество слайдов: 60

Консольные приложения Лекция 8 Консольные приложения Лекция 8

План лекции Введение в Windows API n Консольные API-функции n Обработка событий n План лекции Введение в Windows API n Консольные API-функции n Обработка событий n

Введение в Windows API Введение в Windows API

Введение в Windows API Программирование в Windows основано на использовании функций API n Application Введение в Windows API Программирование в Windows основано на использовании функций API n Application Programming Interface – интерфейс прикладного программирования n Количество API-функций более 2000 n

Введение в Windows API Самый актуальный вариант справки по Windows API: MSDN (Microsoft Developer Введение в Windows API Самый актуальный вариант справки по Windows API: MSDN (Microsoft Developer Network) http: //msdn. microsoft. com n Локальный вариант MSDN: поставляется с Visual Studio n

Введение в Windows API Для использования API-функций в приложении нужно подключить системные библиотеки импорта Введение в Windows API Для использования API-функций в приложении нужно подключить системные библиотеки импорта при помощи директивы INCLUDELIB n Эти библиотеки не содержат API-функций, а только информацию о них n Сами функции находятся в динамических библиотеках *. dll (c: windowssystem 32) n

Введение в Windows API n kernel 32. dll – функции управления (памятью, приложениями, ресурсами, Введение в Windows API n kernel 32. dll – функции управления (памятью, приложениями, ресурсами, файлами) n user 32. dll – функции интерфейса пользователя (обработка оконных сообщений, таймеры, меню) n gdi 32. dll (Graphic Device Library) – интерфейс графического устройства (оконная графика) n comctl 32. dll (Common Controls Library) – функции управляющих элементов (стиль Windows XP)

Введение в Windows API n Вызов API-функций осуществляется с использованием соглашения STDCALL: ¨ параметры Введение в Windows API n Вызов API-функций осуществляется с использованием соглашения STDCALL: ¨ параметры передаются в обратном порядке – справа налево; ¨ стек очищает процедура n n Возвращаемое API-функцией значение находится в регистре EAX При вызове API-функций сохраняется содержимое регистров EBP, EBX, ESI, EDI, ESP

Введение в Windows API n Для всех функций, имеющих строковые параметры, существуют по две Введение в Windows API n Для всех функций, имеющих строковые параметры, существуют по две версии: ¨с суффиксом А (Message. Box. A) – для ASCII-кодировки; ¨ с суффиксом W (Message. Box. W) – для кодировки Unicode

Введение в Windows API Пример. Вызов функции Message. Box: int Message. Box(HWND h. Wnd, Введение в Windows API Пример. Вызов функции Message. Box: int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type) n n h. Wnd – дескриптор окна, в котором будет появляться сообщение lp. Text – текст, который будет появляться в окне lp. Caption – заголовок окна сообщения u. Type – тип сообщения

Введение в Windows API n Все типы являются 32 -разрядными числами: – 32 -битное Введение в Windows API n Все типы являются 32 -разрядными числами: – 32 -битное целое ¨ LPCTSTR – указатель на строку (адрес) ¨ UINT – беззнаковое целое ¨ HWND

Введение в Windows API. MODEL FLAT, STDCALL. . . EXTERN Message. Box. A@16: NEAR. Введение в Windows API. MODEL FLAT, STDCALL. . . EXTERN Message. Box. A@16: NEAR. . . MB_OK EQU 0 str 1 DB “Error”, 0 str 2 DB “Error of input”, 0 HW DD ? . . . PUSH MB_OK PUSH offset str 1 PUSH offset str 2 PUSH HW CALL Message. Box. A@16

Консольные API-функции Консольные API-функции

Консольные API-функции n Windows поддерживает два типа приложений: ¨ основанные на графическом интерфейсе (Graphical Консольные API-функции n Windows поддерживает два типа приложений: ¨ основанные на графическом интерфейсе (Graphical User Interface, GUI); ¨ консольные (Console User Interface, CUI) n n n Консоль – текстовое окно Консоль – интерфейс для ввода-вывода в текстовом режиме Система создает консоль, когда запускается консольное приложение

Консольные API-функции n Консоль состоит из входного буфера (input buffer) и одного или нескольких Консольные API-функции n Консоль состоит из входного буфера (input buffer) и одного или нескольких экранных буферов (screen buffers) n Входной буфер содержит очередь входных событий (нажатие клавиш, события мыши, изменение размеров экранного буфера) n Выходной буфер – это двумерный массив символов и цветовых данных для вывода на экран

Консольные API-функции n Консольный процесс использует дескрипторы (описатели, handles) для доступа к входному и Консольные API-функции n Консольный процесс использует дескрипторы (описатели, handles) для доступа к входному и экранному буферам своей консоли n Дескриптор представляет собой индекс в таблице дескрипторов, принадлежащих процессу n Таблица дескрипторов содержит указатели на все объекты, используемые данным процессом

Консольные API-функции Открытые дескрипторы процесса можно посмотреть, например, при помощи Process Explorer n Для Консольные API-функции Открытые дескрипторы процесса можно посмотреть, например, при помощи Process Explorer n Для этого нужно открыть нижнюю панель с дескрипторами: View – Lower Pane View – Handles n

Консольные API-функции Чтобы получить дескриптор консоли, нужно использовать следующую функцию: HANDLE Get. Std. Handle Консольные API-функции Чтобы получить дескриптор консоли, нужно использовать следующую функцию: HANDLE Get. Std. Handle (DWORD n. Std. Handle) Функция возвращает дескриптор одного из стандартных устройств: n стандартного ввода (standard input) n стандартного вывода (standard output) n стандартного сообщения об ошибке (standard error)

Консольные API-функции Аргументом функции Get. Std. Handle является одна из следующих констант: n для Консольные API-функции Аргументом функции Get. Std. Handle является одна из следующих констант: n для ввода: STD_INPUT_HANDLE equ -10 n для вывода: STD_OUTPUT_HANDLE equ -11 n для сообщения об ошибке: STD_ERROR_HANDLE equ -12

Консольные API-функции n Значения констант можно узнать в файле windows. inc (c:  masm Консольные API-функции n Значения констант можно узнать в файле windows. inc (c: masm 32 include)

Консольные API-функции После работы с дескриптором, его необходимо закрыть при помощи функции Close. Handle: Консольные API-функции После работы с дескриптором, его необходимо закрыть при помощи функции Close. Handle: BOOL Close. Handle(HANDLE h. Object)

Консольные API-функции Для вывода на консоль используется функция Write. Console: BOOL Write. Console( HANDLE Консольные API-функции Для вывода на консоль используется функция Write. Console: BOOL Write. Console( HANDLE h. Console. Output, const VOID* lp. Buffer, DWORD n. Number. Of. Chars. To. Write, LPDWORD lp. Number. Of. Chars. Written, LPVOID lp. Reserved )

Консольные API-функции n HANDLE h. Console. Output n – дескриптор выходного буфера консоли const Консольные API-функции n HANDLE h. Console. Output n – дескриптор выходного буфера консоли const VOID* lp. Buffer n – адрес строки для вывода на консоль DWORD n. Number. Of. Chars. To. Write n – длина строки LPDWORD lp. Number. Of. Chars. Written n – адрес переменной, куда будет помещено количество действительно выведенных символов LPVOID lp. Reserved – зарезервировано, нужно 0

Консольные API-функции Для завершения приложения используется функция Exit. Process: VOID Exit. Process(UINT u. Exit. Консольные API-функции Для завершения приложения используется функция Exit. Process: VOID Exit. Process(UINT u. Exit. Code)

Консольные API-функции Пример: Console. asm n Ассемблирование: n ML /c /coff /Fl prog. asm Консольные API-функции Пример: Console. asm n Ассемблирование: n ML /c /coff /Fl prog. asm – ассемблирование без компоновки ¨ /coff – формат COFF объектного файла ¨ /Fl – генерация листинга ¨ /c n Компоновка: LINK /subsystem: console prog. obj

Консольные API-функции Для создания консоли из процесса можно воспользоваться двумя способами: 1) функция Alloc. Консольные API-функции Для создания консоли из процесса можно воспользоваться двумя способами: 1) функция Alloc. Console (без аргументов) 2) функция Create. Process с параметром CREATE_NEW_CONSOLE При завершении программы консоль автоматически освобождается

Консольные API-функции Для чтения из входного буфера используется функция Read. Console: BOOL Read. Console( Консольные API-функции Для чтения из входного буфера используется функция Read. Console: BOOL Read. Console( HANDLE h. Console. Input, LPVOID lp. Buffer, DWORD n. Number. Of. Chars. To. Read, LPDWORD lp. Number. Of. Chars. Read, LPVOID lp. Reserved );

Консольные API-функции n HANDLE h. Console. Input – дескриптор входного буфера консоли n LPVOID Консольные API-функции n HANDLE h. Console. Input – дескриптор входного буфера консоли n LPVOID lp. Buffer – адрес буфера, куда будет помещена информация n DWORD n. Number. Of. Chars. To. Read – размер буфера n LPDWORD lp. Number. Of. Chars. Read – количество фактически прочитанных символов n LPVOID lp. Reserved – зарезервировано, нужно 0

Консольные API-функции Установку позиции курсора осуществляет функция Set. Console. Cursor. Position: BOOL Set. Console. Консольные API-функции Установку позиции курсора осуществляет функция Set. Console. Cursor. Position: BOOL Set. Console. Cursor. Position( HANDLE h. Console. Output, COORD dw. Cursor. Position );

Консольные API-функции n HANDLE h. Console. Output – дескриптор выходного буфера консоли n COORD Консольные API-функции n HANDLE h. Console. Output – дескриптор выходного буфера консоли n COORD dw. Cursor. Position – структура, определяющая координаты курсора

Консольные API-функции Структура для определения координат символов в консоли называется COORD: COORD STRUC X Консольные API-функции Структура для определения координат символов в консоли называется COORD: COORD STRUC X WORD ? Y WORD ? COORD ENDS ; номер столбца ; номер строки Начальная позиция (левый верхний угол) имеет координаты (0, 0)

Консольные API-функции Цвет шрифта устанавливает функция Set. Console. Text. Attribute: BOOL Set. Console. Text. Консольные API-функции Цвет шрифта устанавливает функция Set. Console. Text. Attribute: BOOL Set. Console. Text. Attribute( HANDLE h. Console. Output, WORD w. Attributes );

Консольные API-функции n HANDLE h. Console. Output – дескриптор выходного буфера консоли n WORD Консольные API-функции n HANDLE h. Console. Output – дескриптор выходного буфера консоли n WORD w. Attributes – атрибуты текста

Консольные API-функции Слово атрибутов получается путем комбинации при помощи операции OR следующих констант: n Консольные API-функции Слово атрибутов получается путем комбинации при помощи операции OR следующих констант: n n n n FOREGROUND_BLUE FOREGROUND_GREEN FOREGROUND_RED FOREGROUND_INTENSITY BACKGROUND_BLUE BACKGROUND_GREEN BACKGROUND_RED BACKGROUND_INTENSITY equ 1 h ; синий цвет букв equ 2 h ; зеленый цвет букв equ 4 h ; красный цвет букв equ 8 h ; повышенная интенсивность букв equ 10 h ; синий цвет фона equ 20 h ; зеленый цвет фона equ 40 h ; красный цвет фона equ 80 h ; повышенная интенсивность фона

Консольные API-функции Заголовок окна консоли определяет функция Set. Console. Title: BOOL Set. Console. Title( Консольные API-функции Заголовок окна консоли определяет функция Set. Console. Title: BOOL Set. Console. Title( LPCTSTR lp. Console. Title ); где lp. Console. Title – адрес строки, оканчивающейся на ноль (в OEM-кодировке)

Консольные API-функции OEM-кодировка – это вид 1 -байтовой кодировки символов, используемой в MS-DOS и Консольные API-функции OEM-кодировка – это вид 1 -байтовой кодировки символов, используемой в MS-DOS и в файловой системе Windows n Символы с кодами 32 -127 в OEM и ASCII совпадают n

Консольные API-функции Всего консольных функций около 60 n При правильном их завершении возвращается ненулевое Консольные API-функции Всего консольных функций около 60 n При правильном их завершении возвращается ненулевое значение n В случае ошибки в EAX помещается ноль n Отладку консольных приложений можно осуществлять в дизассемблерах (W 32 Dasm, Olly. Dbg) n Пример: Console 2. asm n

Обработка событий Обработка событий

Обработка событий n n n Программирование в Windows основано на событийной модели – приложение Обработка событий n n n Программирование в Windows основано на событийной модели – приложение получает сообщения о событиях, происходящих в системе и в самом приложении Большинство событий связано с клавиатурой и мышью Основа программирования в Windows – написание процедур, которые реагируют на сообщения операционной системы

Обработка событий Большинство консольных приложений строится по принципу пакетной обработки: программа состоит из последовательности Обработка событий Большинство консольных приложений строится по принципу пакетной обработки: программа состоит из последовательности идущих друг за другом операций n Однако при создании консольных приложений можно использовать и событийную модель n

Обработка событий n Для получения сообщений от клавиатуры и мыши в консольном приложений можно Обработка событий n Для получения сообщений от клавиатуры и мыши в консольном приложений можно использовать функцию Read. Console. Input: BOOL Read. Console. Input( HANDLE h. Console. Input, PINPUT_RECORD lp. Buffer, DWORD n. Length, LPDWORD lp. Number. Of. Events. Read );

Обработка событий n h. Console. Input – дескриптор входного буфера консоли n lp. Buffer Обработка событий n h. Console. Input – дескриптор входного буфера консоли n lp. Buffer – указатель на массив структур типа INPUT_RECORD, которые получают данные из входного буфера n n. Length – размер предыдущего массива, измеряемый в элементах n lp. Number. Of. Events. Read – указатель на переменную, которая получает количество прочитанных входных записей

Обработка событий n Структура INPUT_RECORD: typedef struct _INPUT_RECORD { WORD Event. Type; union { Обработка событий n Структура INPUT_RECORD: typedef struct _INPUT_RECORD { WORD Event. Type; union { KEY_EVENT_RECORD Key. Event; MOUSE_EVENT_RECORD Mouse. Event; WINDOW_BUFFER_SIZE_RECORD Window. Buffer. Size. Event; MENU_EVENT_RECORD Menu. Event; FOCUS_EVENT_RECORD Focus. Event; } Event; } INPUT_RECORD;

Обработка событий n Event. Type ¨ число, указывающее тип события в поле Event ¨ Обработка событий n Event. Type ¨ число, указывающее тип события в поле Event ¨ может принимать следующие значения: n KEY_EVENT equ 1 h n MOUSE_EVENT equ 2 h n WINDOW_BUFFER_SIZE_EVENT equ 4 h

Обработка событий Структура KEY_EVENT_RECORD: typedef struct _KEY_EVENT_RECORD { BOOL b. Key. Down; WORD w. Обработка событий Структура KEY_EVENT_RECORD: typedef struct _KEY_EVENT_RECORD { BOOL b. Key. Down; WORD w. Repeat. Count; WORD w. Virtual. Key. Code; WORD w. Virtual. Scan. Code; union { WCHAR Unicode. Char; CHAR Ascii. Char; } u. Char; DWORD dw. Control. Key. State; } KEY_EVENT_RECORD; n

Обработка событий n n b. Key. Down ¨ Если клавиша нажата, это поле = Обработка событий n n b. Key. Down ¨ Если клавиша нажата, это поле = TRUE w. Repeat. Count ¨ Счетчик, n указывающий что клавиша была удержана w. Virtual. Key. Code ¨ Виртуальный код нажатой клавиши (не зависит от устройства)

Обработка событий Виртуальные коды некоторых клавиш: n VK_BACK (08) – BACKSPACE n VK_TAB (09) Обработка событий Виртуальные коды некоторых клавиш: n VK_BACK (08) – BACKSPACE n VK_TAB (09) – TAB n VK_RETURN (0 D) – ENTER n VK_SHIFT (10) – SHIFT n VK_CONTROL (11) – CTRL n VK_ESCAPE (1 B) – ESC n VK_LSHIFT (A 0) – Left SHIFT n VK_RSHIFT (A 1) – Right SHIFT

Обработка событий n n w. Virtual. Scan. Code ¨ Виртуальный скан-код нажатой клавиши, который Обработка событий n n w. Virtual. Scan. Code ¨ Виртуальный скан-код нажатой клавиши, который представляет значение, сгенерированное клавиатурой u. Char ¨ Объединение следующих членов: n Unicode. Char – символ Unicode n Ascii. Char – символ ASCII

Обработка событий n dw. Control. Key. State – указывает состояние управляющих клавиш: ¨ RIGHT_ALT_PRESSED Обработка событий n dw. Control. Key. State – указывает состояние управляющих клавиш: ¨ RIGHT_ALT_PRESSED ¨ LEFT_ALT_PRESSED ¨ RIGHT_CTRL_PRESSED ¨ LEFT_CTRL_PRESSED ¨ SHIFT_PRESSED ¨ CAPSLOCK_ON 0 x 0001 0 x 0002 0 x 0004 0 x 0008 0 x 0010 0 x 0080

Обработка событий Расположение структуры INPUT_RECORD в памяти (в случае события клавиатуры): 0 Eventtype 1 Обработка событий Расположение структуры INPUT_RECORD в памяти (в случае события клавиатуры): 0 Eventtype 1 2 Padding 3 bkey. Down Padding 2 w. Repeat. Count w. Virtual. Key. Code w. Virtual. Scan. Code u. Char dw. Control. Key. State

Обработка событий n Структура MOUSE_EVENT_RECORD: typedef struct _MOUSE_EVENT_RECORD { COORD dw. Mouse. Position; DWORD Обработка событий n Структура MOUSE_EVENT_RECORD: typedef struct _MOUSE_EVENT_RECORD { COORD dw. Mouse. Position; DWORD dw. Button. State; DWORD dw. Control. Key. State; DWORD dw. Event. Flags; } MOUSE_EVENT_RECORD;

Обработка событий n n dw. Mouse. Position ¨ структура типа COORD, которая содержит местоположение Обработка событий n n dw. Mouse. Position ¨ структура типа COORD, которая содержит местоположение курсора, в координатах символьных ячеек экранного буфера dw. Button. State ¨ состояние кнопок мыши: n FROM_LEFT_1 ST_BUTTON_PRESSED 0 x 0001 n RIGHTMOST_BUTTON_PRESSED 0 x 0002

Обработка событий n dw. Control. Key. State ¨ n указывает состояние управляющих клавиш dw. Обработка событий n dw. Control. Key. State ¨ n указывает состояние управляющих клавиш dw. Event. Flags тип события мыши ¨ если значение равно нулю, это означает, что одна из кнопок была нажата или отпущена ¨ DOUBLE_CLICK (0 x 0002) – второе нажатие кнопки мыши генерирует это событие. Первое нажатие вызвало обычное событие нажатие кнопки ¨ MOUSE_MOVED (0 x 0001) – изменение позиции указателя мыши ¨ MOUSE_WHEELED (0 x 0004) – колесико мыши ¨

Обработка событий Расположение структуры INPUT_RECORD в памяти (в случае события мыши): 0 1 Eventtype Обработка событий Расположение структуры INPUT_RECORD в памяти (в случае события мыши): 0 1 Eventtype dw. Mouse. Position. X dw. Button. State dw. Control. Key. State dw. Event. Flags 2 3 Padding dw. Mouse. Position. Y

Обработка событий n Структура WINDOW_BUFFER_SIZE_RECORD typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dw. Size; } Обработка событий n Структура WINDOW_BUFFER_SIZE_RECORD typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dw. Size; }

Обработка событий n dw. Size ¨ структура COORD, которая содержит размер экранного буфера консоли Обработка событий n dw. Size ¨ структура COORD, которая содержит размер экранного буфера консоли в символах столбцов и строк

Обработка событий Для консольного приложения определено пять критических событий: n CTRL + C n Обработка событий Для консольного приложения определено пять критических событий: n CTRL + C n CTRL + BREAK n Закрытие консоли (кнопка «Закрыть» ) n Завершение сеанса (Log Off) n Завершение работы системы (Shut Down)

Обработка событий n n По умолчанию эти события обрабатывает система Для определения собственной процедуры Обработка событий n n По умолчанию эти события обрабатывает система Для определения собственной процедуры обработки используется функция: BOOL Set. Console. Ctrl. Handler( PHANDLER_ROUTINE Handler. Routine, BOOL Add );

Обработка событий n Handler. Routine ¨ n указатель на определенную в программе функцию Handler. Обработка событий n Handler. Routine ¨ n указатель на определенную в программе функцию Handler. Routine. Параметр может быть NULL. Add если этот параметр равен TRUE, обработчик (handler) добавляется ¨ если параметр FALSE, обработчик удаляется ¨ ¨ если параметр Handler. Routine == NULL и ADD == TRUE, процесс игнорирует обработку CTRL+C ¨ если параметр Handler. Routine == NULL и ADD == FALSE, процесс возобновляет обработку CTRL+C

Обработка событий n Пример: сonsole 3. asm Обработка событий n Пример: сonsole 3. asm