тов.
. Три года ещё не прошло
--- может и "как есть" сгодится...
Вот подсистема Console, которая реализует In и Out для консоли. Она у меня не доделана для работы с unicode, и вообще не доведена до ума - вроде alpha-версия. Но для отладочных целей хватает (особенно в DLL), а больше пока не надо.
Работает, но есть (пока) недостаток - не могу переназначить вывод в файл (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