Содержание
  ДОМОЙ
  НОВОСТИ  
  IT АКАДЕМИЯ
  WAP-ВЕРСИЯ
  ФОРУМ
  БЕЗОПАСНОСТЬ
  ПРОГРАММИРОВАНИЕ
  ИНСТРУМЕНТ ВЕБМАСТЕРА
  ВСЁ ДЛЯ КПК
  СТАТЬИ NEW
  СОФТ
  ВИДЕО
  X-INFO
  ПРОКСИ ЛИСТ
  IT МУЗЫКА
  АНЕКДОТЫ
  ССЫЛКИ
  ТЕХ. ПОДДЕРЖКА
  ПРАВООБЛАДАТЕЛЯМ
  О НАС

 

Ваш IP

18.219.253.199

Человек на сайте На сайте: 484 человек(а)

Здесь могла бы
быть Ваша
РЕКЛАМА




Untitled Document
полный мануал по консольным приложениям в windows


SLAyer


Для чего этот мануал:
В статье я попытаюсь как можно более полно изложить тему работы с консолью в win32, вместе с тем я хочу затронуть большинство функций которые могут понадобиться при работе с консолью, даже самые отдалённые. Суть этого мануала - как можно подробнее рассказать о консоли, и показать что консоль - очень удобна в использовании, особенно на стадии отладки проекта, когда консоль практически не заменима.


Пре:
Хотя я думаю, что практически все имеют представление о консоли, всё же я немогу обойти данную тему и не рассказать о консоли. Если вы имеете достаточное представление о консоли и её применении, можете смело пропускать эту главу.
Итак, ничего нового - консоль в windows, это нечто вроде dos в окне, у консоли существует только один текстовый режим, никакой графики, хотя конечно "рисовать", если можно так сказть, в консоли всё же можно, но не попиксельно а символьно, тобишь мы можем нарисовать прямоугольник символами имеющими определённый цвет или фон. Собственно так и работает всеми любимый far.
Теперь об использовании. Вы можете вопросить: а зачем же нужна консоль, windows для того и создана, что окошки использовать. Это так но не совсем. Во первых, чтобы работать с консолью, не нужно парится с вопросами создания-удаления-обработки сообщений окна, а это товарищи, драгоценное время, и строчки кода. Иногда гораздо проще быстро вывести строку, результат, или запросить у пользователя данные, создавать ради этого отдельное окно нужно только в случае, если программа уже довершена, и вот-вот попадёт в руки к конечному пользователю, однако на стадии отладки, когда каждая строка итак может стать миной под ногами программиста, совать в код лишние процедуры, и килобайты кода, по меньшей мере глупо. Так что в отношеии отладки - консоль немного впереди. Так же, консоль бывает намного проще в использовании и работе с ней, например если вы пишите программу, особенно расчитанную на людей, понимающих, вовсе незачем создавать интерфейс, естественно я имею ввиду те случаи, когда необходимо всего лишь ввести-вывести пару строк.
Думаю с этим мы разобрались, так что перейдём к следующей главе.


Инструменты:
Собственно, последней преградой перед самим програмированием, у нас будет выбор интсрументов, т.к. язык программирования. Как я писал выше, я попытаюсь описать работу как можно полнее, поэтому по мере выкладывания определённого кода, который будет писаться на дельфи, т.к. он очень прост и быстр в использовании, я буду давать полные комментарии и отличия кода на дельфи, от других языков, в часности, я буду затрагивать обязательно ассемблер и немного реже си, т.к. код на си мало отличается от дельфи, (если брать всравнении с ассемблером).


1. азы:
Как полагается начнём мы именно с азов. Итак, пустой проект в дельфи будет выглядеть как он обычно и вглядит :

program ConsoleApp;

uses Windows;

begin

end.

И никаких {$APPTYPE CONSOLE}, это конечно пока, позже я поясню различия. Первым делом, я расскажу об самой "основе" - создаётся консоль до безобразия простой функцией - AllocConsole, которая сообщает windows, что надо бы выделить для нас новую конслоь. Она не принимает никаких параметров а возвращает булевое значение, если неравно нулю - значит все создано успешно, если 0 значит что-то помешало выполнить системе эту операцию. Теперь детали - каждый процесс может иметь только одну консоль! В противном случае система вернёт ошибку при создании нескольких консолей. Далее, при вызове AllocConsole, система устанавливает созданной консоли хендлы ввода, вывода, и вывода ошибок. Стандартный дескриптор ввода указывает на входной буфер в памяти, а дескрипторы вывода и вывода ошибок на экранный буфер консоли. Чтобы что-то вывести или получить из консоли нужно всего лишь узнать эти значения, с помошью функции GetStdHandle. У неё всего один входной параметр - идентификатор чего вы хотите получить, параметр может принимать такие значения:

STD_INPUT_HANDLE - дескриптор входного буфера
STD_OUTPUT_HANDLE - дескриптор экранного буфера
STD_ERROR_HANDLE - дескриптор экранного буфера ошибок

Если функция выполнилась успешно, она вернёт значение дескриптора, в противном случае она вернёт значение INVALID_HANDLE_VALUE. Это был обычный метод получения дескрипторов. Однако, я сказал что буду описывать как можно более полно, поэтому не могу обойти вниманием альтернативу - функцию CreateFile. Собственно, она так же может вернуть либо дескриптор экранного буфера, либо дескриптор входного буфера, однако, для того чтобы получить их, нужно передать функции определённые параметры. Вот стандартные параметры которые обязательно надо использовать, иначе консоль не будет создана.

lpFileName - если вы хотите получить хэндл ввода, используйте в имени строку CONIN$, для получения дескриптора вывода, используйте CONOUT$
dwDesiredAccess - должен быть обязательно с GENERIC_READ or GENERIC_WRITE доступом
dwShareMode - должен быть FILE_SHARE_READ or FILE_SHARE_WRITE
lpSecurityAttributes - можно опустить - nil в дельфи, NULL в си, и 0 в ассемблере соответственно.
dwCreationDistribution - обязательно OPEN_EXISTING
dwFlagsAndAttributes - параметр игнорируется, устанавливаем в ноль
hTemplateFile - игнорируется, так же устанавливаем в ноль

После вызова, функция, при удачном исходе вернёт нужный нам дескриптор, случае же краха, мы получим значение INVALID_HANDLE_VALUE.
Теперь самое время поговорить о высвобождении консоли. Чтобы windows уничтожила консоль, нужно вызвать FreeConsole. Сразу оговорюсь, о пользе этой операции. Людей, считающих, что ExitProcess вполне достаточно, для выхода из программы, с созданной консолью, могу смело отослать на первый курс аграрного университета. Как бы вам понравилось, еслиб к вам пришли друзья или гости, веселились бы, пили пиво, празновали свадьбу/день рождения/просто так, нагадили, разбросали бутылки и ушли? По меньшей мере вам бы это, я думаю врятли понравилось, вот и мы должны убирать за собой. Суть в том, что при создании консоли, windows выделяет память для буферов ввода-вывода, именно её, и без того загруженную, мы с вами должны беречь. Да и вообще, у любого грамотного программиста, есть в правилах высвобождать неиспользуюмую память после работы с ней. После такого отступления, я думаю можно продолжить. Вышеупомянутая FreeConsole, так же как и AllocConsole, не требует входных параметров, вся забота ложится на ос, нам лишь надо знать, что FreeConsole возвращает булевое значение, и если оно равно 0 (или FALSE) значит, произошла ошибка, в противном случае, высвобождение консоли произведено успешно.
И наконец я покончил с теорией в этом разделе. Теперь приведу простую программу на дельфи, которая создаёт - и тут же уничтожает консоль, дав только немного на неё посмотреть, вызовом функции Sleep.

Листинг 1.0 : простейшая консольная программа (дельфи):

program ConsoleApp;

uses Windows;

begin
    AllocConsole; // создаём консоль
    Sleep(2000); // любуемся ей 2 секунды
    FreeConsole; // уничтожаем
end.

Просмотрев листинг, вы наверника заметили, что программа не блещет сложностью кода :)
В си, как я говорил, сам код не имеет больших отличий, поэтому я опушу его листинг. Так же поступим и с ассмеблером, т.к. пока здесь отсутствуют какие либо различия в параметрах.


2. запись-чтение:
Итак, записывать в консоль можно несколькими способами, здесь я постараюсь описать их все, ну или почти все. Собственно, при записи в консоль, мы просто напросто пишем в область памяти её экранного буфера. Чтобы было понятней, представим себе школьную тетрадь. Мы можем записать в любую клетку символ, а потом скажем windows, чтобы она вывела символы из буфера непосредственно на экран. Например, мы напишем в несколько подряд идущих клеток посередине слово "консоль", теперь это слово лежит в экранном буфере нашей тетради, если мы отвернёмся на время, а потом опять посмотрим на эту страничку надпись будет там, она не куда не денется, так же и при перерисовке, windows берёт из этого буфера символы и рисует их непосредственно на окне консоли. Дескриптор этого буфера мы и получаем, задавая STD_OUTPUT_HANDLE, при вызове GetStdHandle. Так же у консоли есть входной буфер. Когда мы вводим какие либо символы, они сохраняются именно туда. Это и есть STD_INPUT_HANDLE. Вообще, стандартные дескрипторы можно изменять, например для перенаправления ввода-вывода, и это очень удобно, однако я опишу это несколько позже, так как это не входит в тему данной главы.
Первой описанной функцией будет WriteConsole. Собственно WriteConsole, очень схожа с функцией WriteFile. WriteConsole имеет такие входные параметры:

hConsoleOutput - дескриптор вывода
pBuffer - указатель на буфер, с текстом, который необходимо вывести. null-terminated строка, то есть строка должна заканчиваться символом с кодом 0.
nNumberOfCharsToWrite - количество символов, которые вы хотите вывести. Это может быть размер буфера, если вы не знаете заранее количество символов.
lpNumberOfCharsWritten - указатель на четырёхбайтовый (DWORD) буфер, в который будет записано количество дейсвительно выведенных символов.
lpReserved - зарезервирован, устанавливаем в NULL или 0.

Если текст из буфера выведен удачно - функция вернёт нам ненулевое значение, то есть TRUE, в противном же случае мы получим FALSE. Замечу, что функция практически полностью дублирует WriteFile, как в параметрах так и в использовании, при вызове WriteFile, параметры абсолютно те же, поэтому я опущу описание этой функции, позже я приведу несколько примеров, с использованием WriteFile.

Другие статьи

По всем вопросам и предложениям по сайту пишите на info@comp-info.ru
 


Содержание
  ДОМОЙ
  НОВОСТИ  
  IT АКАДЕМИЯ
  WAP-ВЕРСИЯ
  ФОРУМ
  БЕЗОПАСНОСТЬ
  ПРОГРАММИРОВАНИЕ
  ИНСТРУМЕНТ ВЕБМАСТЕРА
  ВСЁ ДЛЯ КПК
  СТАТЬИ NEW
  СОФТ
  ВИДЕО
  X-INFO
  ПРОКСИ ЛИСТ
  IT МУЗЫКА
  АНЕКДОТЫ
  ССЫЛКИ
  ТЕХ. ПОДДЕРЖКА
  ПРАВООБЛАДАТЕЛЯМ
  О НАС

 
Поиск по сайту
Утилиты

  Сниффер
  Лог сниффера
  MD5 и Base64
  Декодирование MD5 NEW
 Перекодировщик
  Проверить прокси
  Проверка анонимности
  Генерация пароля
  Скрипт определения IP
  Поиск информации
   Проверить IP (Whois)
   Узнать скорость закачки
   Добавить свой сайт в поисковые системы>
   Подсветка php-кода

ПОЛЕЗНАЯ ИНФОРМАЦИЯ:
  Список национальных доменных имен
  Компьютерные термины
  Смайлики
   Аналоги Win-программ в Linux
   Коды ответа HTTP сервера
   Записки невесты программиста

Здесь могла бы
быть Ваша
РЕКЛАМА





Права на содержащиеся на сайте материалы принадлежат авторам материалов и владельцам проекта.
Copyright Комп-Инфо.ру © 2005