控制管道StdIn和StdOut

时间:2011-10-22 16:33:47

标签: c winapi pipe

我已经在网上阅读了一些关于如何重定向程序的stdin和stdout的教程,但是我需要一些关于如何控制它的帮助。

到目前为止,我有这个:

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打印输出消息,但这并不是我对stdin的预期响应,即“whoami”。我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以使用WriteFile写入stdin管道。但是你必须先用CreatePipe创建一个。您还需要一个stdinstdout的不同管道,否则cmd.exe将在其自己的输出上进入无限循环的错误。

MSDN上有一个完整的例子:

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

旧的SO问题也可能有所帮助:

Grab Program's Console Output

答案 1 :(得分:1)

您将NULL作为最后两个参数传递给ReadFile,这是不允许的。 The documentation

  

仅当lpOverlapped参数不为NULL时,此参数[lpNumberOfBytesRead]才为NULL。

答案 2 :(得分:0)

你不断改变你的问题,所以除了最后一个答案之外没有任何意义。您正在获取命令提示符启动消息,因为这是cmd打印到stdout的第一件事。一切都按预期工作。