Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чуба 12.02.2012.docx
Скачиваний:
4
Добавлен:
16.08.2019
Размер:
36.84 Кб
Скачать

Понятие консоли

Консоль – это интерфейс, обеспечивающий поддержку программ, работающих в текстовом режиме, т.е. программ, написанных в стиле MS DOS.

Консоль состоит из буфера ввода и одного или нескольких экранных буферов.

Буфер ввода представляет собой очередь, каждая запись в которой содержит информацию о вводных событиях. Под вводными событиями в данном случае подразумевается нажатие и отжатие клавиш клавиатуры, мыши, движения мыши, а также действия пользователя, производимые с окном.

Экранный буфер – это двумерный массив, который содержит коды символов и цвета символов текстового экрана (аналог видеобуфера в текстовом режиме при работе в MS DOS).

Каждая программа, работающая в текстовом режиме, взаимодействует с ОС Windows через консоль. Если одна программа запускается из консоли, принадлежащей другой программе, то запускаемая программа работает в той же консоли. Если же программа запускается самостоятельно из ОС Windows, то ей выделяется собственная консоль (фактически ей выделяется целая виртуальная машина). Другими словами, каждая программа может получить для себя эмулятор DOS–машины и считать, что весь компьютер принадлежит только ей.

Рассмотрим пример программы, которая запускает новый процесс.

#include <windows.h>

#include <stdio.h>

int main() {

STARTUPINFO Startup; // описывает тип основного окна программы и

// дескрипторы стандартных устройств ввода/вывода

// для нового процесса.

PROCESS_INFORMATION ProcInfo; // содержит дескрипторы и идентификаторы

//созданного процесса и его потока

DWORD nOut, // будет содержать количество символов,

// выведенных на экран

dwWait; // для содержания причины завершения процесса

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

LPSTR FName = new char [256]; // для хранения строки символов с именем

// запускаемого процесса

BOOL Flag; // для определения успешности запуска процессора

sprintf(FName,"%s","\0"); // обнуление строки символов с именем файла

strcat(FName,"D:\\Ivanova\\Lab_work\\Lab_VS\\aaa\\Debug\\aaa.exe\0");

GetStartupInfo(&StartUp); // определяет дескрипторы стандартных устройств

// для нового процесса, используя родительскую

// информацию

Flag = CreateProcess(FName, // имя запускаемой программы или NULL

NULL, // NULL или адрес командной строки, где первый ее

// параметр – имя программы

NULL, // указатель на структуру атрибутов безопасности

//процесса или NULL (по умолчанию)

NULL, // указатель на структуру атрибутов //безопасности

//процесса или NULL (по умолчанию)

TRUE, //определяет должен ли новый процесс //наследовать

//копии открытых наследуемых дескрипторов

CREATE_NEW_CONSOLE, //флаги, определяющие создание каковым //будет

//создан процесс (с новой консолью), если 0 то

//используется консоль родительского процесса

NULL, //указатель на блок окружения (среда) или //NULL, если копия родительского процесса

NULL, //указатель на диск и каталог процесса или NULL,если используются родительские

&StartUp //

&ProcInfo); //

if (!Flag) //проверка на ошибку создания процесса

{ WriteConsole(hStdOut.&("Error create process\n"),20,&nOut,NULL);

exit(l); }

//Ожидание завершения запущенного процесса, т.е пока дочерний

//процесс не завершоен, родительский не может выполнятся

dwWait = WaitForSingleObject( Proclnfo.hProcess, // дескриптор процесса

INFINITE); //время ожидания в //миллисекундах

//0-немедленно, INFINITE //бесконечно

if (IdwWail = 0) //определение причины //завершения (0 x ffffffff - ошибка)

{ WnteConsole(hStdOut.^("Error executed"), 14.&nOut,NULL);

exit(l); }

CIoseHandle(ProcInfo.hProcess // закрытие дескриптора процесса

CloseHandle(ProcInfo.hThread); // закрытие дескриптора потока

return () }