Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Здравствуйте.
Проблема вот в чем:
Имеется файл 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 Кб, 158 просмотров)

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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