Консольные приложения представляют собой систему средств взаимодействия пользователя с компьютером, основанную на использовании текстового (буквенно-цифрового) режима дисплея или аналогичных (командная строка MS-DOS, Far). Консольные приложения очень компактны не только в откомпилированном виде, но и в текстовом варианте, и имеют такие же возможности обращаться к ресурсам Windows посредством API-функций, как и обычные графические приложение.
Для работы с консольными приложениями Windows используются соответствующие функции Windows API. В программе на ассемблере записываются имена вызываемых функций как внешние, а сами функции расположены в системном каталоге Windows. Для обращения к ним используется подключаемый файл библиотеки (*.lib), в котором указывается, в каком системном.dll файле расположена вызываемая функция и файл описания прототипов функций (*.inc). Для подключения файла библиотеки используется директива includelib, для подключения файла прототипа – директива include:
Полезные команды для командной строки
Подключаемые библиотеки могут указываться в программе при помощи директивы includelib или при сборке приложения (команда link).
Пример простейшего консольного приложения.
.MODEL flat, stdcall
STD_OUTPUT_HANDLE EQU -11 ; константа Win API
consoleOutHandle dd? ; дескриптор консоли вывода
bytesWritten dd? ; количество байт(вспомогательная)
message db «Привет всем!»,13,10,0; текст (13 = r, 10=n 0= )
h EQU $-message; ; длина текстовой строки (константа)
main PROC ; начало функции
INVOKE GetStdHandle, STD_OUTPUT_HANDLE; Получить дескриптор консоли ввода
mov consoleOutHandle,eax ; поместить его в EAX
INVOKE CharToOem,offset message,offset message; перекодировка сообщения
INVOKE WriteConsole, ; функция вывода в консоль
consoleOutHandle, ; дескриптор консоли
offset message, ; указатель строки
eax, ; длина строки
offset bytesWritten, ; количество выведенных байт
0 ; возвращается функцией
INVOKE ExitProcess,0 ; Окончание программы
main ENDP ; окончание процедуры (функции)
END main ; окончание модуля
Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);
nStdHandle может принимать значения
STD_INPUT_HANDLE = -10 устройство ввода
STD_OUTPUT_HANDLE = -11 устройство вывода
STD_ERROR_HANDLE = -12 ошибка
Функция перекодировки русского текста, введенного в Win-кодовой странице, в код, читаемый в консоли (DOS-кодировку). Возвращаемое значение 1 в случае успешной перекодировки.
BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst)
lpszSrc – указатель на строку-источник;
lpszDst – указатель на строку-приемник;
Функция вывода текстовой информации в консоль.
BOOL WINAPI WriteConsole(
__in HANDLE hConsoleOutput,
__in const VOID* lpBuffer,
Команды Windows
__in DWORD nNumberOfCharsToWrite,
__out LPDWORD lpNumberOfCharsWritten,
__reserved LPVOID lpReserved);
hConsoleOutput – дескриптор буфера вывода консоли, который может быть получен при помощи функции GetStdHandle.
lpBuffer – указатель на буфер, где находится выводимый текст.
nNumberOfCharsToWrite – количество выводимых символов.
lpNumberOfCharsWritten – указывает на переменную DD, куда будет помещено количество действительно выведенных символов.
lpReserved – резервный параметр, должен быть равен 0.
Буфер, где находится выводимый текст, не обязательно должен заканчиваться нулем, поскольку для данной функции указывается количество выводимых символов.
Функция завершения Windows-приложения.
VOID WINAPI ExitProcess(__in UINT uExitCode);
параметр uExitCode – код завершения.
Для трансляции консольного приложения из командной строки используются следующие команды
ml /с /coff cons1.asm
link /subsystem:console cons1.obj
При этом необходимо объявить все вызываемые API-функции как внешние с помощью директивы EXTERN.
Трансляция из Visual Studio осуществляется аналогично диалоговому приложению, но необходимо указать платформу subsystem:console либо при создании проекта (тип Win32 Console Application), либо указать в уже существующем проекте в окне свойств.
Основные динамические библиотеки kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib подключаются в командной строке редактора связей link.exe в Visual Studio, поэтому отсутствие директив типа
не будет ошибкой.
Библиотеки kernel32.lib, user32.lib подключаются линковщиком по умолчанию, поэтому нет необходимости подключать их директивой includelib.
Консольные приложения могут создать свою консоль. В этом случае весь ввод-вывод будет производиться в эту консоль. Если приложение консоль не создает, то здесь может возникнуть двоякая ситуация: либо наследуется консоль, в которой программа была запущена (например, консоль Fara), либо Windows создает для приложения свою консоль.
Для того чтобы создать свою консоль, используется функция
BOOL WINAPI AllocConsole(void);
По завершении программы все выделенные консоли автоматически освобождаются. Однако это можно сделать и принудительно, используя функцию
BOOL WINAPI FreeConsole(void);
Дополнительные функции для работы с консолью
Функция чтения строки из буфера консоли
BOOL WINAPI ReadConsole(
__in HANDLE hConsoleInput,
__out LPVOID lpBuffer,
__in DWORD nNumberOfCharsToRead,
__out LPDWORD lpNumberOfCharsRead,
__in_opt LPVOID pInputControl);
hConsoleInput – дексриптор буфера ввода консоли, полученного функцией GetStdHandle.
lpBuffer – указатель на буфер, куда помещается вводимый текст.
nNumberOfCharsToRead – длина буфера ввода.
lpNumberOfCharsRead– указатель на переменную DD (32 бит), куда будет помещено количество действительно введенных символов.
pInputControl – резервный параметр, должен быть равен нулю.
Функция опредления размеров окна консоли
BOOL WINAPI SetConsoleScreenBufferSize(
__in HANDLE hConsoleOutput,
__in COORD dwSize);
hConsoleOutput – дексриптор буфера вывода консоли;
dwSize – структура координат, задающая размер окна консоли:
Функция установки позиции курсора в окне консоли
BOOL WINAPI SetConsoleCursorPosition(
__in HANDLE hConsoleOutput,
__in COORD dwCursorPosition);
hConsoleOutput– дексриптор буфера выходной консоли;
dwCursorPosition– структура координат COORD, определяющая позицию курсора.
Функция определения заголовка окна консоли
BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);
lpConsoleTitle — указатель на строку имени консоли, заканчивающуюся нуль-символом.
Функция определения атрибутов вводимых символов в окне консоли
BOOL WINAPI SetConsoleTextAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttributes);
hConsoleOutput – дексриптор буфера вывода консоли;
wAttributes – цвет букв и фона, получаемый путем комбинации констант
FOREGROUND_BLUE equ 1h;синий
FOREGROUND_GREEN equ 2h;зеленый
FOREGROUND_RED equ 4h;красный
FOREGROUND_INTENSITY equ 8h;интенсивный
BACKGROUND_BLUE equ 10h;синий фон букв
BACKGROUND_GREEN equ 20h;зеленый фон букв
BACKGROUND_RED equ 40h;красный фон букв
BACKGROUND_INTENSITY equ 80h;интенсивный фон букв
Функция, задающая цвет фона консоли (путем закрашивания фона отдельных символов)
BOOL WINAPI FillConsoleOutputAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttribute,
__in DWORD nLength,
__in COORD dwWriteCoord,
__out LPDWORD lpNumberOfAttrsWritten);
hConsoleOutput – дексриптор буфера вывода консоли;
wAttribute – атрибут цвета фона символа в консоли;
nLength – количество ячеек символов, фон которых устанавливается заданным цветом;
dwWriteCoord – координаты первой закрашиваемой ячейки;
lpNumberOfAttrsWritten – указатель на 4-байтный идентификатор, в который записывается количество реально закрашенных ячеек.
Функция, получающая информацию о клавиатуре и мыши в консольном режиме:
BOOL WINAPI ReadConsoleInput(
__in HANDLE hConsoleInput,
__out PINPUT_RECORD lpBuffer,
__in DWORD nLength,
__out LPDWORD lpNumberOfEventsRead);
hConsoleInput – дескриптор входного буфера консоли;
lpBuffer – указатель на структуру (или массив структур) PINPUT_RECORD, в которой содержится информация о событиях, происшедших с консолью;
nLength – количество получаемых информационных записей (структур);
lpNumberOfEventsRead – указатель на двойное слово, содержащее количество реально полученных записей.
Структура PINPUT_RECORD используется для получения события, происшедшего в консоли. Всего системой зарезервировано пять типов событий:
KEY_EV equ 1h ; клавиатурное событие
MOUSE_EV equ 2h ; событие с мышью
WINDOW_BUFFER_SIZE_EV equ 4h ; изменился размер окна
MENU_EV equ 8h ; зарезервировано
FOCUS_EV equ 10h ; зарезервировано
Остальные байты структуры зависят от происшедшего события.
bKeyDown DD?;При нажатии клавиши значение поля больше нуля
wRepeatCount DW?;Количество повторов при удержании клавиши
wVirtualKeyCode DW?;Виртуальный код клавиши
wVirtualScanCode DW?;Скан-код клавиши
UnicodeChar DW?;код символа в формате Unicode
;для функции (ReadConsoleInputW)
AsciiChar DB?;код символа в формате ASCII
ENDS ;для функции (ReadConsoleInputA)
dwControlKeyState DD?;Содержится состояния управляющих клавиш.
;Может являться суммой следующих констант:
; RIGHT_ALT_PRESSED equ 1h
; LEFT_ALT_PRESSED equ 2h
; RIGHT_CTRL_PRESSED equ 4h
; LEFT_CTRL_PRESSED equ 8h
; SHIFT_PRESSED equ 10h
; NUMLOCK_ON equ 20h
; SCROLLLOCK_ON equ 40h
; CAPSLOCK_ON equ 80h
; ENHANCED_KEY equ 100h
dwMousePosition COORD <>;координаты курсора мыши
dwButtonState DD? ; состояние кнопок мыши.
;первый бит — левая кнопка,
;второй бит — правая кнопка,
;третий бит — средняя кнопка.
;Бит установлен — кнопка нажата.
dwControlKeyState DD? ; Состояние управляющих клавиш
dwEventFlags DD? ; Может содержать значения:
; MOUSE_MOVED equ 1h; было движение мыши
; DOUBLE_CLICK equ 2h; был двойной щелчок
dwSize COORD <>; новый размер консольного окна
События MENU_EVENT_RECORD и FOCUS_EVENT_RECORD зарезервированы.
Структура, объединяющая все типы событий:
Источник: infopedia.su
Консольные приложения для Windows
Консольные приложения — некогда единственная форма программного обеспечения для работы конечного пользователя, с которой сталкивался средний человек использовавший компьютер. И после широкого распространения программ с графическим интерфейсом, консольные приложения еще долго сохраняли свое значение. Но постепенно программное обеспечение с GUI практически полностью вытеснило приложения с текстовым интерфейсом из повседневного использования у среднего конечного пользователя.
Однако и сейчас есть консольные приложения, которые могут в большей или меньшей степени конкурировать с программами графического интерфейса, быть полезными среднему пользователю для использования на современных компьютерах при решении разнообразных задач.
- Консольные приложения для Windows. Файловые менеджеры
- Консольные приложения для Windows. Мультимедиа
- Консольные приложения для Windows. Веб браузеры
- Консольные приложения для Windows. Текстовые редакторы
Помимо консольных файловых менеджеров, мультимедийных программ, текстовых редакторов, веб браузеров есть еще масса программ и утилит с текстовым интерфейсом, которые могут применяться под Windows; как отдельные, так и сразу имеющиеся в дистрибутиве MS Windows. Например, ipconfig и netstat для работы с сетью, встроенный FTP клиент Windows, который может быть удобен для некоторых задач, CommandBurner для записи на CD / DVD из командной строки или cdburn с dvdburn из Windows Server 2003 Support Tools для того же самого, и т.д.
Источник: www.kompx.com
Консольные приложения для windows
В настоящее время, когда у разработчиков программного обеспечения появляется всё больше возможностей для сознания приложений со сложным графическим интерфейсом, консольные приложения по-прежнему прочно удерживают свои позиции, даже в такой, казалось бы им среде, как современная операционная система Windows. Это объясняется в первую очередь простотой их исполнения и некоторыми специфическими особенностями консольных приложений, которые делают их в ряде случаев более подходящими для решения задачи, чем приложения с графическим интерфейсом. Один минус: выглядят такие приложения очень уныло и однообразно, как безликая серая масса букв и цифр на чёрном фоне окна консоли. Но не всё так безнадёжно, как может показаться на первый взгляд. В этой статье я попытаюсь дать несколько полезных рецептов расширения функциональности консольных приложений и придания их внешнему виду большей выразительности.
И так: начнём с заголовка окна консоли. При запуске программы в заголовке окна отображается полное имя файла, с которого было запущено приложение. Вместо имени файла, в заголовке окна можно указать любой другой текст: название приложения, например. Это делается с помощью функции SetConsoleTitle. Далее рассмотрим проблему с выводом на консоль текста кириллицы.
Практически каждому программисту когда-нибудь приходилось с этим сталкиваться. По сложившейся традиции, для вывода текста на консоль в большинстве примеров на C++ используются функции стандартной библиотеки, такие как printf или puts, которые работают с текстом в кодировке OEM, что соответствует кодовой странице 866 для русского языка.
То же самое происходит при использовании потока вывода cout. Но проблема в том, что большинство текстовых редакторов для Windows работают с текстом в кодировке ANSI, что для русского языка соответствует кодовой странице 1251. Как решить эту проблему? Проще всего использовать функции, которые записывают текст непосредственно в буфер консоли, а не в стандартный поток. Для этого нужно в программный код включить заголовочный файл CONIO.H и, вместо функций printf и puts, вызывать аналогичные функции _cprintf и _cputs. Так они выглядят в коде на Visual C++:
Несложно написать и собственную процедуру вывода текста на консоль с использованием системной функции WriteConsole. Вот пример такой процедуры: А вот так она используется: Как вы уже наверно заметили, для перевода строки необходимо указывать последовательность из двух символов: «rn», в отличие от стандартного потока, где указывается лишь один символ ‘n’.
Но бывает и так, что нужно вывести текст именно через стандартный поток, чтобы его можно было перенаправить в текстовый файл или в другое консольное приложение. Для этого текст нужно перевести в другую кодировку с помощью функции CharToOem. Или использовать функцию WideCharToMultiByte с параметром CP_OEMCP, если ваш текст в кодировке UNICODE. Размер буфера консоли по умолчанию равен 80х300, т.е.
300 строк по 80 символов каждая. Задать буферу консоли другой размер можно при помощи функции SetConsoleScreenBufferSize. Атрибутами текста консоли являются: цвет символов и цвет заднего фона. Код атрибута соответствует числовому значению в диапазоне от 0x00 до 0x7F. Так выглядит таблица с числовыми значениями атрибутов текста в шестнадцатеричном коде:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 2A | 2B | 2C | 2D | 2E | 2F |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 3A | 3B | 3C | 3D | 3E | 3F |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 4A | 4B | 4C | 4D | 4E | 4F |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 5A | 5B | 5C | 5D | 5E | 5F |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 6A | 6B | 6C | 6D | 6E | 6F |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 7A | 7B | 7C | 7D | 7E | 7F |
Функция SetConsoleTextAttribute задаёт выводимому тексту указанный атрибут. Для задания всему окну консоли указанных атрибутов применяется функция FillConsoleOutputAttribute. Позиционирование текста (т.е. установка курсора на позицию с заданными координатами) производится с помощью функции SetConsoleCursorPosition.
Полный код моего примера в Visual C++ 2005 выглядит так: Приведённый пример был создан в среде Visual C++ 2005 как проект Win32 Console Application. В заключение хочу отметить, что возможности консольного интерфейса Windows отнюдь не исчерпываются теми функциями, которые были упомянуты в этой статье. Не было рассказано про получение и обработку сообщений от мыши, об использовании в консольных приложениях возможностей графического интерфейса Windows. Но об этом речь пойдёт в дальнейших публикациях. Источник
Источник: onecomp.ru