Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переадресация стандартного ввода вывода

841
11 декабря 2007 года
_nic
199 / / 29.07.2006
Пытаюсь разобратся как это сделать.Вроде бы чтобы с стандартным вводом выводом консольной программы можно было работать как с файлом,надо этот ввод вывод пустить через пайпы.Я пытался сделать так(с cmd):
Код:
#include <windows.h>
#include <iostream.h>
#include <string.h>
main()
{
STARTUPINFO si;
char *a=new char[1024*1024];
char buf[1024],bufin[1024];
DWORD ind,i2,i3,t;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE cstdin, wstdin, rstdout, cstdout;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
GetStartupInfoA(&si);
CreatePipe(&cstdin, &wstdin, &sa, 0);
CreatePipe(&rstdout, &cstdout, &sa, 0);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
si.hStdOutput = cstdout;
si.hStdError = cstdout;
si.hStdInput = cstdin;
CreateProcessA(0, "cmd", 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi);
for(;;)
{
ReadFile(rstdout,buf,1024,&i2,0);
strcpy(a,buf);
cout<<a;
cin>>bufin;
WriteFile(wstdin,bufin,strlen(bufin),&i3,0);
}
}

Только фактически ничего невышло. Выводит только какой то каламбур состоящей из стандартного приветствия виндовой консоли и ни как не реагирует на вводимые команды :( Люди плиз подскажите что я делаю не так :confused:
1.9K
12 декабря 2007 года
max_dark
256 / / 11.11.2005
Вот что у меня вышло
Код:
#include <windows.h>
#include <iostream.h>
#include <string.h>
int main()
{
    STARTUPINFO si;
    //char *a=new char[1024*1024];
    char buf[1024],bufin[1024];
    DWORD i2,i3;//,ind,t;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES sa;
    HANDLE cstdin, wstdin, rstdout, cstdout;
    sa.lpSecurityDescriptor = NULL;
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfoA(&si);
    CreatePipe(&cstdin, &wstdin, &sa, 0);
    CreatePipe(&rstdout, &cstdout, &sa, 0);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = FALSE;
    si.hStdOutput = cstdout;
    si.hStdError = cstdout;
    si.hStdInput = cstdin;
    CreateProcessA(0, "cmd", 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi);//
    for(;;)
    {
        BOOL read=TRUE;
        while (read == TRUE) { // пока есть что считывать
            memset(buf,0,1024); // Очищаем буфер
            ReadFile(rstdout,buf,1024,&i2,0);
            read = (i2 == 1024);
            //strcpy(a,buf);
            cout<<buf;//a;
        }
        cin.getline(bufin,1023);
        strcat(bufin,"\n"); // добавляем перевод строки
        WriteFile(wstdin,bufin,strlen(bufin),&i3,0);
        if (strcmpi(bufin,"exit\n")==0)
            break; // Выход по exit
    }
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return 0;
}
841
12 декабря 2007 года
_nic
199 / / 29.07.2006
Да действительно так работает :) Только я вот немогу понять почему пр вводе команды приходится два раза жать ввод :confused: Как то что оказалась в пайпе ввода ещё попутно оказывается в пайпе выхода ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог