> Как в С++ из dll'ки или win-приложения открыть консоль, а потом туда
> печатать обычным printf?
AllocConsole() и далее открыть FILE* для ввода/вывода, используя имена
файлов "CONIN$" и "CONOUT$" соответственно. Только пользоваться придётся
fprintf() и fscanf(). После AllocConsole() просто начать использовать
printf()/scanf() не получится, ибо STD_xxx_HANDLE создаются для консоли
где-то в недрах AllocConsole(), тогда как stdin и stdout создаются при
старте программы/библиотеки, то есть раньше, когда консоли ещё не было.
Если же очень хочется printf()/scanf(), то можно попробовать что-то
вроде
*stdin=*freopen("CONIN$", "rt", stdin);
*stdout=*freopen("CONOUT$", "wt", stdout);
Не знаю достаточно хорошо стандарт на plain-C, но вроде там не было
запретов на изменение stdXXX-ов. Помню в Borland C++ 4.5 + PowerPack for DOS
прекрасно работало
stdin=freopen("CONIN$", "rt", stdin);
а вот в VC нет, ибо stdXXX у него не l-value почему-то. Однако в виду того,
что это библиотека к plain-C, не C++, то ИМХО не будет большой беды, если
просто перезаписать содержимое структуры поверх. Хак, конечно, но решения
проще я в своё время не нашёл. Можно перед этим сохранить старое содержимое
этих структур, например
FILE tempStdin=*stdin;
а в конце восстановить обратно:
fclose(stdin);
*stdin=tempStdin;
Всё ж не такой хак. Да и не лишне будет FreeConsole() сделать, когда не
нужна будет.
--
С уважением, boroda
Номер выпуска : 5059
Возраст листа : 796 (дней)
Количество подписчиков : 551
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/480325
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru