Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Шеховцов_1.docx
Скачиваний:
73
Добавлен:
09.11.2019
Размер:
14.73 Mб
Скачать

17.1.3. Термінальне введення-виведення у Win32 api

Основним для термінального введення-виведення у Win32 є поняття консолі [50]. Воно відрізняється від визначеного раніше; фактично консоль — це наданий ОС спеціальний емулятор термінала.

Звичайно консоль пов'язують із конкретним процесом. Для процесів, які за­пускає ОС, консолі пов'язують із консольними процесами, точкою входу для яких є функція mainO. Під час виклику CreateProcessO виділення окремої консолі для процесу задається вмиканням прапорця створення CREATEjNEW CONSOLE. Крім того, кілька процесів можуть спільно використовувати одну й ту саму консоль (на­приклад, після виклику CreateProcessO новий процес за замовчуванням успадко­вує консоль предка).

Логічна структура консолі аналогічна до наведеної на рис. 17.1, за винятком того, що з нею може бути пов'язано кілька буферів виводу. Можна виводити дані у різні буфери, а потім перемикатися між ними.

Для роботи із консоллю є два набори функцій. Функції високого рівня дають змогу працювати зі стандартними вводом та виводом і визначати деякі режими керування консоллю. Функції низького рівня дають можливість застосуванням отримувати повну інформацію про інтерактивну роботу користувача із клавіату­рою і мишею. У більшості випадків застосуванню достатньо функцій високого рівня; прикладом застосування, розробленого із використанням функцій низько­го рівня, є файловий менеджер far.

Наперед визначені дескриптори у Win32

Наперед визначені дескриптори у Win32 пов'язані із консоллю. Відмінність від POSIX полягає в тому, що такі дескриптори не відповідають конкретним цілим числам, а завжди є результатом виклику функції GetStdHandleC)

HANDLE GetStdHandleCDWORD std_const):

Параметр stdconst визначає, який дескриптор буде повернуто функцією, і за­дається як константа STD_INPUT_HANDLE, STDOUTPUTHANDLE або STD_ERROR_HANDLE.

char buf[1024]: DWORD bytesj-ead. bytes_written:

HANDLE stdin. stdout:

// одержати стандартні дескриптори

Stdin - GetStdHandle(STD_INPUT_HANDLE);

stdout = GetStdHandle(STD_OUTPUT_HANDLE);

// зчитати дані з файлу стандартного вводу

ReadFile(stdin. buf. sizeof(buf). &bytes_read. 0);

// вивести їх же у файл стандартного виводу

WriteFile(stdout. buf. Bytes_read. &bytes_written. 0):

Програмне керування консоллю

На відміну від UNIX, у Win32 консоллю за замовчуванням володіють лише спе­ціалізовані консольні застосування або ті, для яких було встановлено прапорець CREATEjNEW_C0NS0LE, проте будь-яке застосування, що використовує графічний інтер­фейс, може створити собі консоль явно. Для цього використовують функцію А1 locConsole(). Після її виклику можна працювати зі стандартними вводом і виво­дом, вони будуть спрямовані на створену консоль. Після завершення роботи ре­сурси консолі можна вивільнити, викликавши FreeConsoleO.

AllocConsole():

// ... введення-виведення з використанням дескрипторів,

// повернутих GetStdHandle()

FreeConsole():

Для керування режимами консолі Win32 пропонує аналоги tcgetattr() і tcse­tattrO - функції GetConsoleModeO і SetConsoleModeO. Як перший параметр вони приймають дескриптор відкритої консолі, другим є маска прапорців режимів кон­солі (ENABLE_ECHO_INPUT задає роботу в режимі луни).

GetConsoleMode(stdin, &mode);

SetConsoleMode(stdin. mode & -ENABLEECHOINPUT);

// ... введення з використанням stdin без луни SetConsoleMode(stdin. mode);

// відновлення режиму