CreateProcess() и подмена стандартных потоков ввода/вывода
От: bhy  
Дата: 20.08.07 06:23
Оценка:
Добрый день.
запускаю cmd.exe, вместо стандартных потоков подсовываю пайпы
код:
char progrn[50]="cmd.exe";
char buff[150];

HANDLE hstdin,h_write_to_stdin;
HANDLE hstdout,h_read_from_stdout;
HANDLE hstderr,h_read_from_stderr;


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

if (!CreatePipe(&hstdin,&h_write_to_stdin,&sa,0)) 
    printf("error create pipe stdin %s",itoa(GetLastError(),tempbuf,10));
if (!CreatePipe(&h_read_from_stdout,&hstdout,&sa,0)) 
    printf("error create pipe stdout %s",itoa(GetLastError(),tempbuf,10));
if (!CreatePipe(&h_read_from_stderr,&hstderr,&sa,0)) 
    printf("error create pipe stderr %s",itoa(GetLastError(),tempbuf,10));


STARTUPINFO si;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.cbReserved2=0;
si.lpReserved2=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdError=hstderr;
si.hStdInput=hstdin;
si.hStdOutput=hstdout;
si.dwFlags=0;
PROCESS_INFORMATION pi;


rez=CreateProcess(NULL,progrn,&sa,&sa,TRUE,0,NULL,NULL,&si,&pi);
if (!rez) return 1;

AllocConsole();
DWORD BytesRead;

    while (PeekNamedPipe(h_read_from_stdout, buff, sizeof(buff), 
                    &BytesRead, NULL, NULL)) 
    {
        DWORD BufferCnt, BytesToWrite;
        BYTE PrevChar = 0;
        BYTE Buffer2[250];

        if (BytesRead > 0)
        {
            ReadFile(h_read_from_stdout, buff, sizeof(buff), 
                    &BytesRead, NULL);
        }
        else
        {
            Sleep(50);
            continue;
        }


        }
        
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),Buffer2,BytesToWrite,&BytesRead,NULL);
    }


cmd запускается как обычно, не получается подменить его потоки ввода/вывода. Причем в другой программе похожий код
работает правильно — удается читать/писать в потоки cmd.exe
где грабли, что исправить?
Добавлена разметка — Кодт
20.08.07 16:15: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.