Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

консоль в С++

Хой!
Как в С++ из dll'ки или win-приложения открыть консоль, а потом туда
печатать обычным printf?

Номер выпуска : 5055
Возраст листа : 796 (дней)
Количество подписчиков : 551
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/480232
Получить правила : 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

Ответить   Wed, 23 Nov 2005 23:32:40 +0500 (#480232)

 

Ответы:

Функция GetStdHandle помогает получить дескриптор консоли, куда можно писать
с помощью WriteFile или printf. а можно еще писать с помощью WriteConsole.

Номер выпуска : 5058
Возраст листа : 796 (дней)
Количество подписчиков : 551
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/480304
Получить правила : 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

Ответить   Fri, 25 Nov 2005 10:41:13 +0300 (#480304)

 

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

Ответить   Шматко А.А. Fri, 25 Nov 2005 11:37:40 +0300 (#480325)