Управление по трубопроводам StdIn и StdOut - PullRequest
0 голосов
/ 22 октября 2011

Я прочитал некоторые учебники в сети о том, как перенаправить стандартный ввод и вывод программы, но мне нужна помощь, как управлять им.

Пока у меня есть это:

HANDLE hSTD_OUT_READ;
HANDLE hSTD_OUT_WRITE;
HANDLE hSTD_IN_READ;
HANDLE hSTD_IN_WRITE;
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(saAttr); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hSTD_OUT_READ,&hSTD_OUT_WRITE,&saAttr,0);
SetHandleInformation(hSTD_OUT_READ, HANDLE_FLAG_INHERIT, 0);
CreatePipe(&hSTD_IN_READ,&hSTD_IN_WRITE,&saAttr,0);
SetHandleInformation(hSTD_IN_WRITE, HANDLE_FLAG_INHERIT, 0);
memset(&cmdProcess,0,sizeof(cmdProcess));
memset(&cmdInfo,0,sizeof(cmdInfo));
cmdProcess.cb = sizeof(cmdProcess);
cmdProcess.dwFlags = STARTF_USESTDHANDLES;
cmdProcess.hStdError = hSTD_OUT_WRITE;
cmdProcess.hStdOutput = hSTD_OUT_WRITE;
cmdProcess.hStdInput = hSTD_IN_READ;
CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&cmdProcess,&cmdInfo);
DWORD BytesWritten;
WriteFile(hSTD_IN_WRITE,&cmd,sizeof(cmd),&BytesWritten,NULL);
CloseHandle(hSTD_OUT_WRITE);
DWORD BytesRecvd;
while(true)
{
    bSUCCESS =  ReadFile(hSTD_OUT_READ,&recvd,sizeof(recvd),&BytesRecvd,NULL);
    printf(recvd);
    if( ! bSUCCESS || BytesRecvd == 0 ) break; 


}

В этот момент я получил сообщение распечатки windows cmd, но это не было ожидаемой реакцией на мой стандартный ввод "whoami". Что мне делать?

Ответы [ 3 ]

1 голос
/ 22 октября 2011

Вы передали NULL в качестве последних двух параметров ReadFile, что недопустимо. Документация говорит

Этот параметр [lpNumberOfBytesRead] может иметь значение NULL, только если параметр lpOverlapped не равен NULL.

1 голос
/ 22 октября 2011

Вы можете использовать WriteFile для записи в ваш stdin канал. Но сначала нужно создать его с помощью CreatePipe . Вам также нужен другой канал для stdin и stdout, иначе cmd.exe просто войдет в бесконечный цикл ошибок на своем собственном выходе.

На MSDN приведен полный пример:

http://msdn.microsoft.com/en-us/library/ms682499(v=vs.85).aspx

Старый вопрос SO, который также может помочь:

Вывод на консоль программы программы

0 голосов
/ 22 октября 2011

Вы продолжаете менять свой вопрос, поэтому ответы не имеют смысла, кроме последнего. Вы получаете сообщение о запуске командной строки, потому что это первое, что cmd выводит на стандартный вывод. Все работает как положено.

...