OberonCore
https://forum.oberoncore.ru/

Console - Реализация модулей In и Out для виндовой консоли
https://forum.oberoncore.ru/viewtopic.php?f=90&t=2626
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Четверг, 06 Май, 2010 23:22 ]
Заголовок сообщения:  Console - Реализация модулей In и Out для виндовой консоли

Енту подсистему в оформленном виде обещал тов. Роману. Три года ещё не прошло :), но тема опять всплыла --- может и "как есть" сгодится...

Как база использовалась реализация Log для консоли Ивана Горячева (viewtopic.php?p=5979#p5979)
Вложение:
Комментарий к файлу: Tools->Decode
Console.txt [59.34 КБ]
Скачиваний: 1928

(из переписки Евгений Темиргалеев<->AVC)
Евгений Темиргалеев писал(а):
Вот подсистема Console, которая реализует In и Out для консоли. Она у меня не доделана для работы с unicode, и вообще не доведена до ума - вроде alpha-версия. Но для отладочных целей хватает (особенно в DLL), а больше пока не надо.
AVC писал(а):
Работает, но есть (пока) недостаток - не могу переназначить вывод в файл (program.exe > output)
Евгений Темиргалеев писал(а):
С этим тоже возился. Вот что могу вспомнить:
- ощущение, что в винде с этим бардак полный. Для ГУЁвых приложений и консольных механизмы отличаются. (Например, если стартовать гуёвое с консоли, эта консоль для него не будет вводом/выводом по умолчанию, а для консольного будет).
- AllocConsole also sets up standard input, standard output, and standard error handles for the new console. Если Вы создали консоль для гуёвого приложения, то перенаправление в файл пропало.

Вот как сделано в Console (надеюсь, что вспомнил правильно... надо было сразу про эти грабли записать :) ):
1) Модуль StdStreams читает хендлы для стандартных потоков. В т. ч. и при загрузке. Для консольных приложений хендлы есть всегда. Для гуевого если вывод не назначен в файл и не открыта консоль, они будут "никакие". Это отражают флаги nulRead/nulWrite.
2) Модуль Open используется в In/Out для создания консоли. Либо открывается всегда новая консоль (new) либо, только если консоли нету (exists).
3) Процедуры Open в модулях In/Out:
Консоль создаётся только если хендлы ввода/вывода "никакие". Это позволяет для гуёвого приложения направить вывод в файл.
Код:
IF Std.nulRead THEN O.Open(O.exists); Std.Get END

(ред-р колл-ции) карточка: http://oberoncore.ru/bbcc/subs/console/

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/