我已经在网上阅读了一些关于如何重定向程序的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”。我该怎么办?
答案 0 :(得分:1)
您可以使用WriteFile写入stdin
管道。但是你必须先用CreatePipe创建一个。您还需要一个stdin
和stdout
的不同管道,否则cmd.exe
将在其自己的输出上进入无限循环的错误。
MSDN上有一个完整的例子:
http://msdn.microsoft.com/en-us/library/ms682499(v=vs.85).aspx
旧的SO问题也可能有所帮助:
答案 1 :(得分:1)
您将NULL
作为最后两个参数传递给ReadFile
,这是不允许的。 The documentation说
仅当lpOverlapped参数不为NULL时,此参数[lpNumberOfBytesRead]才为NULL。
答案 2 :(得分:0)
你不断改变你的问题,所以除了最后一个答案之外没有任何意义。您正在获取命令提示符启动消息,因为这是cmd打印到stdout的第一件事。一切都按预期工作。