Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Приложение с консольным выводом своими руками  (Прочитано 6759 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Helium
Гость
« : 01-07-2004 20:18 » 

Задача следующая:
есть к примеру виндовое приложение (не имеющее консоли, т.е. не имеющее стандартного ввода и вывода). каким образом руками можно прикрутить к нему консоль так, чтобы работали стандартные функции ввода-вывода (stdio.h или iostream)?

Есть замечтательная функция AllocConsole(), которая приписывает приложению консоль и инициализирует стандартный ввод-вывод. Но после ее вызова стандартные функции типа printf'а работать все равно отказываются (точнее они то работают, но на выделенную консоль ничего не выводится).
Были попытки выделять консоли новые экранные буферы (CreateConsoleScreenBuffer(...)) но и они к успеху не привели.

Если по этому поводу есть какая-нить книжечка - буду оччень признателен.
Заранее пасибо
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 02-07-2004 08:46 » 

Дело в дескрипторах стандартных потоков. Посмотри, наверняка есть ф-ия для привязки дескрипторов к консоли.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-07-2004 21:52 » 

Helium, MSDN Q105305
Цитата
Код:
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
This code opens up a new low-level CRT handle to the correct console output handle, associates a new stream with that low-level handle, and replaces stdout with that new stream. This process takes care of functions that use stdout, such as printf(), puts(), and so forth. Use the same procedure for stdin and stderr.
Проблема в том, что CRT подхватывает значения хендлов потоков при инициализации, и далее уже не меняет. Поэтому надо ручками открывать потоки по хендлам и присваивать в глобальные переменные.
« Последнее редактирование: 29-11-2007 20:53 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Helium
Гость
« Ответ #3 : 04-07-2004 11:04 » 

Большое спасибо. Действительно помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines