Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как читать из консоли? GUI-прога и дочерний консольный процесс 
:(
    Опции темы
Гость_Чайник
Дата 16.10.2004, 07:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет всем!

Можно ли GUI-проге запустить дочерний консольный процесс (не свой консоль!) и из него (из его STD_OUTPUT_HANDLE) читать данные?
Помогите, плиз!

  Вверх
chipset
Дата 16.10.2004, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



CreateProcess в LPSTARTUPINFO есть параметр что то типа output, туда пропиши хэндл файла
и синхронизься с ним smile.gif
Добавлено @ 16:10
Всё остальное RTFMSDN


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Гость_Чайник
Дата 16.10.2004, 16:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











chipset , cделал я как ты и говорил, но... :’( при первом же нажатии клавиши прога console.exe падает. А почему – хз. Помоги, плиз!
Код

void CHiDlg::OnBnClickedOk()
{
HANDLE h1 = ::CreateFile ("e:\\cout.txt", GENERIC_ALL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
ASSERT(h1 != INVALID_HANDLE_VALUE);
HANDLE h2 = ::CreateFile ("e:\\cin.txt", GENERIC_ALL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
ASSERT(h2 != INVALID_HANDLE_VALUE);

STARTUPINFO srt;
memset(&srt, 0, sizeof(srt));
srt.cb = sizeof(srt);
srt.dwFlags = STARTF_USESTDHANDLES;
srt.hStdError = srt.hStdOutput =h1;
srt.hStdInput = h2;
PROCESS_INFORMATION inf;
memset(&inf, 0, sizeof(inf));
CreateProcess(NULL, "E:\\console.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL,&srt, &inf);
}


  Вверх
chipset
Дата 16.10.2004, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



srt.dwFlags = STARTF_USESTDHANDLES;
зачем?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Гость_Чайник
Дата 16.10.2004, 18:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











без него тоже никакого результата :stena
  Вверх
p0s0l
Дата 16.10.2004, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Я делал это через трубы :) (pipes)
Вместо CreateFile сделай CreatePipe - получишь 2 хэндла - для ввода и вывода.
Их и укажи в srt. При создании pipe'а, нужно обязательно указать SECURITY_ATTRIBUTES. Будет примерно так:
Код
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE hread, hwrite;
CreatePipe (&hread, &hwrite, &sa, 0);

   STARTUPINFO srt;
   memset(&srt, 0, sizeof(srt));
   srt.cb = sizeof(srt);
   srt.dwFlags = STARTF_USESTDHANDLES;
   srt.hStdError = srt.hStdOutput =hwrite;
   srt.hStdInput = hread;
   PROCESS_INFORMATION inf;
   memset(&inf, 0, sizeof(inf));
   CreateProcess(NULL, "E:\\console.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL,&srt, &inf);

Читать из пайпа - ReadFile...


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Чайник
Дата 17.10.2004, 10:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пишу в pipe так, но ничего консоль не получает, хотя WriteFile возвращает TRUE. Я что-то не так делаю, но что именно?
Код

Sleep(2000);
DWORD dw = 0;
char buf[] = "Hello!";
while(!WriteFile (hwrite, buf, strlen(buf), &dw, 0));;
MessageBox("Ok");


  Вверх
p0s0l
Дата 17.10.2004, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Дык, надо было сразу сказать, что ты кроме того, что хочешь заполучить вывод, еще хочешь и ввод свой сделать...
В таком случае надо создавать 2 пайпа:
один - для ввода
другой - для вывода
У каждого пайпа, как ты уже замител, есть 2 хэндла: один - для записи в пайп, другой - для чтения из пайпа

Код
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE hin_read, hin_write, hout_read, hout_write;
CreatePipe (&hin_read, &hin_write, &sa, 0);
CreatePipe (&hout_read, &hout_write, &sa, 0);

   STARTUPINFO srt;
   memset(&srt, 0, sizeof(srt));
   srt.cb = sizeof(srt);
   srt.dwFlags = STARTF_USESTDHANDLES;
   srt.hStdError = srt.hStdOutput = hout_write;
   srt.hStdInput = hin_read;
   PROCESS_INFORMATION inf;
   memset(&inf, 0, sizeof(inf));
   CreateProcess(NULL, "E:\\console.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL,&srt, &inf);

// к примеру, пишем какую-то инфу:

 DWORD dw = 0;
 char buf[] = "Hello!";
 WriteFile (hin_write, buf, strlen(buf), &dw, 0); // обрати внимание на то, что используется хэндл ЗАПИСИ ВХОДНОГО пайпа

// ждём, пока консольное приложение завершится (конечно, ждать необязательно)
 WaitForSingleObject(inf.hProcess, INFINITE);

// теперь читаем из консоли:
 char buffer[1024];
 do {
   ReadFile (hout_read, &buffer, 1024, &dw, 0);
// в buffer - часть вывода консоли, можно куда-нить вывести
 } while (dw == 1024); // если dw==1024, то вероятно, еще что-то есть, что можно прочитать из консольного вывода
 



--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Чайник
Дата 17.10.2004, 15:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











p0s0l , СПАСИБО!
Теперь работает, я всё понял :)
Вот токо одна беда - в консоль отправляется из pipe все то, что стоит до первого пробела!!!
  Вверх
p0s0l
Дата 17.10.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Пожалуйста! :)
Цитата
Вот токо одна беда - в консоль отправляется из pipe все то, что стоит до первого пробела!!!
А это как ? Приведи код, тогда посмотрим, в чём там трабл...


--------------------
С уважением, г-н Посол.
PM   Вверх
Guest
Дата 17.10.2004, 18:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











я уже сам разобрался :)
надо было в консоли принимать данные примерно так:
Код
cin.getline ( buf, 50, '\n');


P.S. На этом форуме сидят профи

СПАСИБО!!!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1161 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.