Добрый день.
запускаю 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++. Прикладные вопросы' — Кодт
...
si.dwFlags=STARTF_USESTDHANDLES;
...
si.dwFlags=0;
...