Что такое консольное приложение
На этом шаге мы рассмотрим общие принципы создания консольных приложений .
Консольное приложение — приложение, выполняемое из коммандной строки , например из коммандной строки Far . Часто нет необходимости и времени для создания графического интерфейса, а программа должна что-то делать, например, обрабатывать большие объемы информации. И вот тут на помощь приходят консольные приложения. Ниже вы увидите, что консольные приложения очень компактны не только в откомпилированном виде, но и в текстовом варианте. Но главное, консольное приложение имеет такие же возможности обращаться к ресурсам Windows посредством API -функций, как и обычное графическое приложение.
ml /с /coff cons1.asm link /subsystem:console cons1.obj
tasm32 /ml cons1.asm tlink32 /ap consl.obj
- 1-й параметр — дескриптор буфера вывода консоли, который может быть получен при помощи функции GetStdHandle ;
- 2-й параметр — указатель на буфер, где находится выводимый текст:
- 3-й параметр — количество выводимых символов;
- 4-й параметр — указывает на переменную DWORD , куда будет помещено количество действительно выведенных символов.
- 5-й параметр — резервный параметр, должен быть равен нулю.
Заметим, что буфер, где находится выводимый текст, не обязательно должен заканчиваться нулем, поскольку для данной функции указывается количество выводимых символов. Договоримся только не путать входные/выходные буферы консоли и буферы, которые мы создаем в программе, в том числе и для обмена с буферами консоли.
Пример 1. Простое консольное приложение для MASM32 .
.386P ;Плоская модель памяти. .MODEL FLAT, STDCALL ;Константы. STD_OUTPUT_HANDLE equ -11 ;Прототипы внешних процедур. EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN ExitProcess@4:NEAR ;Директивы компоновщику для подключения библиотек. includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ;Сегмент данных. _DATA SEGMENT DWORD PUBLIC USE32 'DATA' ;Строка в DOS-овской кодировке. STR1 DB "Консольное приложение",0 LENS DD ? ;Количество выведенных символов. RES DD ? _DATA ENDS ;Сегмент кода. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ;Получить HANDLE вывода. PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 ;Длина строки. PUSH OFFSET STR1 CALL LENSTR ;Вывести строку. PUSH OFFSET RES ;Резерв. PUSH OFFSET LENS ;Выведено символов. PUSH EBX ;Длина строки. PUSH OFFSET STR1 ;Адрес строки. PUSH EAX ;HANDLE вывода. CALL WriteConsoleA@20 PUSH 0 CALL ExitProcess@4 ;Строка - [EBP+08H]. ;Длина в ЕВХ LENSTR PROC PUSH EBP MOV EBP,ESP PUSH EAX ;---------------------- CLD MOV EDI,DWORD PTR [EBP+08H] MOV EBX,EDI MOV ECX,100 ;Ограничить длину строки. XOR AL,AL REPNE SCASB ;Найти символ 0. SUB EDI,EBX ;Длина строки, включая 0. MOV EBX,EDI DEC EBX ;---------------------- POP EAX POP EBP RET 4 LENSTR ENDP _TEXT ENDS END START
Текст этой программы можно взять здесь.
Пример 2. Простое консольное приложение для TASM32 .
.386P ;Плоская модель памяти. .MODEL FLAT, STDCALL ;Константы. STD_OUTPUT_HANDLE equ -11 ;Прототипы внешних процедур. EXTERN GetStdHandle:NEAR EXTERN WriteConsoleA:NEAR EXTERN ExitProcess:NEAR ;Директивы компоновщику для подключения библиотек. includelib c:\tasm32\lib\import32.lib ;Сегмент данных. _DATA SEGMENT DWORD PUBLIC USE32 'DATA' ;Строка в DOS-овской кодировке. STR1 DB "Консольное приложение",0 LENS DD ? ;Количество выведенных символов. RES DD ? _DATA ENDS ;Сегмент кода. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ;Получить HANDLE вывода. PUSH STD_OUTPUT_HANDLE CALL GetStdHandle ;Длина строки. PUSH OFFSET STR1 CALL LENSTR ;Вывести строку. PUSH OFFSET RES ;Резерв. PUSH OFFSET LENS ;Выведено символов. PUSH EBX ;Длина строки. PUSH OFFSET STR1 ;Адрес строки. PUSH EAX ;HANDLE вывода. CALL WriteConsoleA PUSH 0 CALL ExitProcess ;Строка - [EBP+08H]. ;Длина в ЕВХ LENSTR PROC PUSH EBP MOV EBP,ESP PUSH EAX ;---------------------- CLD MOV EDI,DWORD PTR [EBP+08H] MOV EBX,EDI MOV ECX,100 ;Ограничить длину строки. XOR AL,AL REPNE SCASB ;Найти символ 0. SUB EDI,EBX ;Длина строки, включая 0. MOV EBX,EDI DEC EBX ;---------------------- POP EAX POP EBP RET 4 LENSTR ENDP _TEXT ENDS END START
Текст этой программы можно взять здесь.
Надо сказать, что, поскольку информация выводится в консольном окне, кодировка всех строковых констант должна быть для DOS . В дальнейшем разъяснится вопрос, как осуществить перекодировку программным путем.
Прокомментируем теперь приведенные выше программы. При запуске их из командной строки, например из программы Far , в строку выводится сообщение «Консольное приложение» . При запуске программы как Windows -приложения консольное окно появляется лишь на секунду. В чем тут дело? Дело в том, что консольные приложения могут создать свою консоль. В этом случае весь ввод-вывод будет производиться в эту консоль. Если же приложение консоль не создает, то здесь может возникнуть двоякая ситуация: либо наследуется консоль, в которой программа была запущена, либо Windows создает для приложения свою консоль.
На следующем шаге мы рассматрим вопросы, связанные с созданием консоли .
Консольное приложение
Текстовый интерфейс пользователя (англ. Text user interface, TUI ; также Character User Interface, CUI ) — система средств взаимодействия пользователя с компьютером, основанная на использовании текстового (буквенно-цифрового) режима дисплея или аналогичных устройств — например, командная строка. Приложения, использующие текстовый интерфейс, называют консольными программами.
Особенности текстового интерфейса
На программном уровне для ввода и вывода информации консольные программы используют стандартные устройства ввода-вывода (stdin, stdout, stderr), хотя могут открывать и другие файлы, сетевые соединения и совершать иные действия, доступные в выполняющей их среде. Вывод печатных символов в stdout и stderr приводит к появлению этих символов на устройстве вывода, то есть к их получению пользователем.
В простейшем случае консольная программа использует интерфейс командной строки, однако многие из таких программ с помощью управляющих последовательностей терминалов создают более дружественный интерфейс, приближающийся к графическому (см.: меню (информатика)).
Некоторые консольные программы пригодны лишь для определённой реализации текстового интерфейса, например, текстовые программы операционных систем, особенно библиотека
Реализация текстового интерфейса
В принципе, консольная программа не обязана заботиться о реализации самого взаимодействия с пользователем, ограничиваясь вводом-выводом на стандартные устройства, использованием библиотек типа программных интерфейсов. Собственно взаимодействие с пользователем обычно осуществляет операционная система или иное программное обеспечение.
Классической реализацией текстового интерфейса, восходящей к первой половине XX века, является алфавитно-цифровое устройство ввода-вывода, например, комплект из клавиатуры и АЦПУ (телетайпа). Впоследствии вместо АЦПУ стали применять мониторы, снабжённые знакогенератором, что позволило быстро и удобно организовывать диалог с пользователем. Подобными устройствами снабжён или может быть снабжён почти каждый современный компьютер. Такие комплекты из монитора и клавиатуры (иногда с добавлением мыши) называются консолью компьютера.
В соответствии с традицией использования консольными программами клавиатуры и АЦПУ для ввода и вывода соответственно взаимодействие таких программ с пользователем свелось к чтению из stdin и выводу на stdout. Таким образом, появилась возможность перенаправлять потоки ввода-вывода, осуществляя взаимодействие с пользователем посредством иных устройств, в том числе подключенных через сеть, а также при помощи специальных программ-эмуляторов терминала, например, рисующих окно с текстом в графическом интерфейсе пользователя (текстовое окно).
В 1970-х годы и позднее выпускались даже специальные устройства, реализующие текстовый интерфейс — текстовые терминалы, подключаемые через последовательный порт к компьютеру напрямую или через модем. С распространением персональных компьютеров функции текстового терминала, как правило, выполняет компьютер, тот, на котором выполняется консольная программа, или другой. Программы ssh (а также Интернет или локальную сеть. Программы konsole и многие другие реализуют текстовый интерфейс посредством текстового окна в среде X Window System.
Альтернативный подход к консольному выводу был использован в персональных компьютерах, в частности (хотя не только), IBM PC под управлением памяти, связанной со знакогенератором монитора, приводя к немедленному изменению видимых на мониторе данных. Такие программы могут также работать в среде Microsoft Windows. Более того, Windows имеет поддержку текстовых окон, во многом превосходящую имевшуюся в DOS, в том числе и для приложений собственно Windows.
Примеры консольных программ
- Любая программа, осуществляющая получение данных от пользователя путём чтения stdin и отправку данных пользователю путём записи в stdout, по определению является консольной программой. Однако, такие программы могут обходиться и безо всякого пользователя, например обрабатывая данные из файлов.
- Текстовые программы для видеопамять Microsoft Windows.
- Unix shell, а также все утилиты, предназначенные для работы в этой среде.
- Midnight Commander (UNIX), FAR Manager (Windows).
- pppstatus, top, htop (UNIX).
См. также
Wikimedia Foundation . 2010 .
Консольные приложения и параметры программы
Аннотация: На этой лекции мы научимся создавать консольные приложения, вводить и выводить данные в консольных программах, устанавливать правильную кодировку и использовать параметры программы.
Цель лекции
Освоить работу с консольными приложениями и с параметрами программы.
Консольные приложения
На сегодняшний день о программировании на Lazarus существует очень мало книг на русском языке, и все они описывают работу в основном, с консольными приложениями, хотя особой надобности в консолях сейчас нет. Но и совсем обойти эту тему нельзя. Что же такое консольное приложение ?
Консольным приложением называется программа , которая не имеет графического интерфейса — окон, и которая работает в текстовом режиме в черно-белой консоли. Команды в такой программе приходиться вводить с клавиатуры, результаты работы консольные приложения также выводят на экран в текстовом режиме.
Если вы пользуетесь операционной системой Windows , то нажмите на «Пуск» и выберите команду «Выполнить«. В открывшемся окне наберите
и нажмите . Откроется командная консоль , в которой команды нужно вводить в текстовом режиме:
Рис. 21.1. Консоль cmd.exe
Собственно, вы видите окно предка Windows — операционной системы MS-DOS . Именно так выглядел экран с загруженной ОС MS-DOS , и управлять ею приходилось, вручную набивая всевозможные команды. Это уже позже корпорация Microsoft навесила на ядро MS-DOS всевозможные драйверы и утилиты, снабдила его графическим оконным интерфейсом, и появилась сначала полуграфическая ОС Windows 3.10 (русский вариант был 3.11 версии), а затем и целиком графическая Windows 95 . Но к консольному ядру системы можно обращаться и в современных ОС, в Windows для этого используется программа cmd.exe, а в ОС Linux — терминал .
Все языки высокого уровня позволяют делать и консольные приложения, другое дело — зачем? Подавляющее большинство современных программ имеет графический интерфейс , который мы с вами создавали с самой первой лекции. А консольные приложения делаются в основном, системными программистами. Несмотря на то, что Object Pascal обладает для этого всеми необходимыми инструментами, системщики обычно пользуются такими языками, как Ассемблер , C, реже — C++. Но все же знать, как создаются консольные приложения нужно, поэтому данную лекцию мы посвящаем им.
Создание консольного приложения
Создать консольное приложение можно разными способами, но проще всего так. Откройте Lazarus. Командой «Проект -> Закрыть проект» закройте текущий проект, автоматически появится окно Мастера создания проекта. В нем нажмем кнопку «Новый проект«. Появится окно создания проекта, в котором можно выбрать «Программа» или «Консольное приложение«. Если мы выберем «Программа«, то будет создан модуль с минимальным кодом. Если же мы выберем «Консольное приложение«, то кода будет больше, так как при этом создается программа с новым классом, производным от TCustomApplication . TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений. Все программы LCL автоматически это используют.
Но нам не нужно использовать возможности класса TCustomApplication , мы делаем простую консольную программу, поэтому в окне создания проекта мы выбираем «Программа«. Сформируется проект, а в Редакторе исходного кода будет минимум текста:
program Project1; uses cthreads, Classes < you can add units after this >; begin end.
Обратите внимание, если нам нужно подключить к программе какие то модули, то делать это нужно до комментария
В этом случае мы ставим запятую после указанного модуля Classes и добавляем свои модули. Завершающая точка с запятой стоит после комментария, нам её ставить не нужно.
Свой код мы будем писать между скобками
begin end.
А если нам потребуется указать глобальные константы , переменные или сделать объявления процедур и функций, то все это делается до begin .
Для примера мы создадим простое приложение , а по ходу дела, познакомимся с инструментами ввода-вывода информации в консольных приложениях.
WRITE и WRITELN
Процедура Write предназначена для вывода информации на экран. Она имеет следующий синтаксис :
procedure Write(var F:Text; Args:Arguments);
Действует процедура следующим образом. В скобках мы можем указать какой-то текст, вывести содержимое переменных. Например:
write('Всем привет. '); write('Переменная a = ', a, '; переменная b = ', b);
После вывода информации на экран курсор остается на той же строчке, в позиции, где он оказался после вывода последнего символа.
Процедура Writeln действует точно также, но после вывода последнего символа курсор переходит на начало следующей строки.
Для ознакомления с процедурами создайте новый проект «Программа«. Модуль можно не переименовывать, просто сохраните его в папку 21-01. Полный текст модуля следующий:
program project1; uses cthreads, Classes < you can add units after this >; var a, b: Integer; begin a:= 5; b:= 10; writeln('Всем привет. '); writeln('Переменная a = ', a, '; переменная b = ', b); readln(); end.
Обратите внимание: раздел переменных var мы указали до служебного слова begin , то есть, переменные a и b в пределах модуля являются глобальными. Далее мы присвоили переменным значения, затем вывели на экран приветствие, а потом содержимое переменных. На процедуру readln() пока не обращайте внимания, она нужна только, чтобы программа не закрылась сразу же после вывода текста, а была на экране, пока мы не нажмем . Сохраните проект и запустите его на выполнение. И сразу же мы видим недостаток: вместо русских букв выходит нечто, что в Интернете называют «кракозябры»:
Рис. 21.2. Неправильный вывод кириллицы в консольной программе
В «Символы и строки» мы упоминали, что в консольных приложениях Windows принято использовать кодировку CP866, тогда как в графических приложениях используется CP1251 и Юникод. Отсюда и «кракозябры». В Linux и Unix таких проблем нет. Однако решить эту проблему совсем несложно. Нажмите , чтобы закрыть консоль , и вернитесь в Редактор кода. Щелкните по окну с кодом правой кнопкой мыши, и в открывшемся контекстном меню выберите команду «Параметры файла -> Кодировка -> CP866«. Откроется окно смены кодировки, нам надо нажать кнопку «Изменить файл«. Снова запустите программу на выполнение — теперь с кодировкой полный порядок :
Windows для новичка: что такое консольные приложения
Каждый второй опытный пользователь, услышав от новичка фразу «А что такое консольная программа?», начинает скрежетать зубами. Поэтому если вы — новичок, то лучше прочитать эту статью, чтобы не напороться на этого второго из двух опытных, а если вы уже опытный пользователь, то имеет смысл подсунуть заметку новичку, чтобы тот нашёл ответ на свой вопрос.
Итак, что же скрывается за этим страшным словосочетанием — консольное приложение? Приложение, как вы знаете, это в мире Windows не то, что к чему-то прикладывается, а компьютерная программа. Word, Excel, пасьянс «Косынка» и Internet Explorer — это всё приложения. Приложения бывают разными. Не только в том смысле, что Word отличается от «Блокнота», но и по принципу организации своего пользовательского интерфейса. Интерфейс — это внешний вид программы, и в Windows он бывает двух типов. Первый — это графический, второй — текстовый. Графический интерфейс система подсовывает вам под нос ежедневно. Все программы, имеющие красивые разноцветные окна, имеют и графический интерфейс. Даже Word и «Блокнот», хоть и работают с текстом, но интерфейс имеют графический. Где же тогда в наши дни можно увидеть программу, работающую в режиме текстового интерфейса?
Для того, чтобы увидеть текстовый пользовательский интерфейс (его ещё называют интерфейсом командной строки — прочитав этот абзац до конца, вы узнаете, почему), не нужно делать каких-то особенно сложных действий. Нажмите кнопку «Пуск», выберите пункт «Выполнить», наберите в строке появившегося окна текст «command» и нажмите кнопку «Выполнить». Вы увидите перед собой окно с серым текстом на чёрном фоне — примерно такое же, как изображено на иллюстрации к статье. Это — командная строка, одна из самых старых вещей в современном персональном компьютере.
Дело в том, что ещё не так давно, около двадцати лет назад, мощности компьютеров, стоящих у пользователей дома и на работе, не хватало на отображение даже такой несложной графики, как окна (что и говорить о трёхмерных видеоиграх!). Поэтому компьютеру и пользователям приходилось общаться с помощью текста. Пользователь вводил специальные команды — например, команда dir в первой из систем производства Microsoft, DOS, позволяла просмотреть список файлов и папок в определённой директории, а команда ver показывала версию операционной системы, с которой работал пользователь. Программы, которые запускал пользователь, тоже, естественно, работали в текстовом режиме.
Командная строка, как вы видите, сохранилась в Windows до сих пор. Команды, которые можно выполнить из неё, подробно описаны в справке Windows. А приложения, которые выполняются в текстовом режиме, теперь называются консольными.
Почему же командная строка продолжает жить, несмотря на свой почтенный возраст? Во-первых, есть множество программ, которым не нужен графический интерфейс — например, программы по взлому паролей, которые просто подбирают комбинации символов, пока то, что закрыто паролем, не откроется. Кроме того, командная строка приходит на помощь тем пользователям, которые выучили назубок её команды и быстро набирают с клавиатуры, — для них она гораздо более быстрый способ работать с компьютером, чем графический интерфейс.
Консольных программ масса, и они используются часто для того, чтобы упростить рутинные действия пользователя. Дело в том, что с ними можно обращаться точно так же, как и с обычными командами. А те, в свою очередь, можно записать в специальный текстовый файл с расширением BAT или CMD (такой файл называется командным), и их можно потом выполнить все залпом как обычную программу — достаточно в «Проводнике» дважды кликнуть по этому файлу мышью.
Так что когда вам в следующий раз посоветуют воспользоваться консольной программой, просто наберите её название в строке «Пуск» -> «Выполнить», не забыв, конечно, и полный путь к ней (например, c:\Downloads\Rar.exe). Если вам предложат указать для неё аргументы, то тоже не надо пугаться. Например, если для программы a нужно передать аргумент b, то в командной строке надо записать «a b», то есть аргументы пишутся через пробел.
Думаю, для начала знакомства с консольными приложениями этой информации вам вполне хватит. А если нет, пишите мне по адресу dreamdrusch@tut.by, будет продолжение.
Вадим СТАНКЕВИЧ