Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 08.09.2018, 08:58   #1
lvvas
 
Регистрация: 22.08.2018
Сообщений: 7
Репутация: 26
По умолчанию Перенаправление (перехват) потоков ввода-вывода

Здравствуйте.
Проблема вот в чем:
Имеется файл code.exe, который ожидает ввода двух чисел и выдаёт их сумму.
Вот его срр-код:
Код:

#include <iostream>
using namespace std;
 int main()
 {
   int a,b;
     cin >> a >> b;
     cout << a+b;
   return 0;
 }

Требуется из консольного приложения запустить этот файл, как дочерний процесс, а в его стандартный поток ввода передать два числа, и прочитать результат.

Вот что я сочинил, после изучения примеров в Инете:
Код:

#include <windows.h>
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(0, "");
    HANDLE in;//дескриптор записи в стандартный поток дочернего процесса
    HANDLE out;//дескриптор чтения из стандартного потока дочернего процесса
    HANDLE read;//дескриптор чтения из пороцесса и записи в pipe
    HANDLE write;//дескриптор записи в процесс из pipe
    
        
    CreatePipe(&in, &write, NULL, 0);   //создаём пайп записи в стандартный поток дочернего прооцесса
    CreatePipe(&read, &out, NULL, 0);   //создаём пайп чтения из стандартного потока дочернего прооцесса
    
    //создаем дочерний процесс
    STARTUPINFO si;//структура для CreateProcess
    ZeroMemory(&si, sizeof(STARTUPINFO));//обнуляем si
    si.hStdOutput = out;//подменяем pipe-дескрипторы для дочернего прооцесса
    si.hStdInput = in;//подменяем pipe-дескрипторы для дочернего прооцесса   
 
    PROCESS_INFORMATION pi;//структура для CreateProcess
    CreateProcess(L"code.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);//запускаем процесс code.exe
    
    //ввод данных из pipe в стандартный поток дочернего процесса
    unsigned long bread = 0;   //кол-во прочитанных байт
    char* dat = "10 20";//данные
    int n = string(dat).size();//размер даннх в байтах
    WriteFile(out, dat, n, &bread, NULL);//пишем из pipe в стандартный поток дочернего процесса
    cout << "Дано: " << dat << endl;
        
    //вывод данных из стандартного потока дочернего процесса в pipe
    char buf[1024]; //буфер вывода
    ReadFile(read, buf, 1023, &bread, NULL);  //читаем из стандартного потока в буфер
    cout << "Результат: "<<buf << endl;
 
return 0;
}

Но код не работает.
Результат на картинке.
Второй пайп, судя по результату, считывает stdin стандартного потока родителя вместо stdout дочернего процесса.
Может найдутся знатоки pipe, которые подскажут что здесь не так?
(работаю в Visual Studio 2017)
Изображения
Тип файла: png результат.png (12.6 Кб, 2 просмотров)

Последний раз редактировалось lvvas; 08.09.2018 в 09:08.
lvvas вне форума   Ответить с цитированием
Старый 08.09.2018, 23:24   #2
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,016
Репутация: 675
По умолчанию

Вы же пишете в out, а нужно в write

И ещё довольно много небрежностей

Последний раз редактировалось Black Fregat; 08.09.2018 в 23:30.
Black Fregat на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват ошибок ввода-вывода _-Re@l-_ C# (си шарп) 10 19.01.2012 09:22
Перехватчик потоков ввода-вывода _Bers Общие вопросы C/C++ 1 20.12.2011 21:41
Перенаправление стандартного ввода/вывода в файл Роман Радер Общие вопросы C/C++ 1 09.01.2010 19:34
Перенаправление ввода/вывода dudeboy Win Api 0 16.11.2009 12:36
перехват консольного ввода\вывода Артем5555555 Win Api 14 29.10.2008 00:20


10:31.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru