我正在尝试创建一个函数,该函数将产生一个程序实例,然后将一些数据输入到它的STDIN中,然后使用C++读取该进程的输出。我看过一个位于here的MSDN示例,这对我来说很困惑,当我尝试使用该示例时,出现了一些令人讨厌的错误代码,它不起作用。通过Windows管道写入进程STDIN
HANDLE hWriteOUT, hReadOUT, hWriteIN, hReadIN;
SECURITY_ATTRIBUTES saPipe = {0};
PROCESS_INFORMATION procInfo = {0};
STARTUPINFO procSi;
DWORD dwWritten, dwRead;
char buf[512];
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.bInheritHandle = TRUE;
saPipe.lpSecurityDescriptor= NULL;
CreatePipe(&hReadOUT, &hWriteOUT, &saPipe, 0);
SetHandleInformation(hReadOUT, HANDLE_FLAG_INHERIT, 0);
CreatePipe(&hReadIN, &hWriteIN, &saPipe, 0);
SetHandleInformation(hReadIN, HANDLE_FLAG_INHERIT, 0);
ZeroMemory(&procSi, sizeof(STARTUPINFO));
procSi.cb = sizeof(STARTUPINFO);
procSi.hStdError = hWriteOUT;
procSi.hStdOutput = hWriteOUT;
procSi.hStdInput = hReadIN;
procSi.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &procSi, &procInfo);
//Gives me an error code of 18 but returns a 1 when a 0 indicates failure.
WriteFile(hWriteIN, "notepad", sizeof("notepad"), &dwWritten, NULL);
cout << GetLastError(); //This gives me error code 18 (ERROR_NO_MORE_FILES)
ReadFile(hReadOUT, buf, 512, &dwRead, NULL);
cout << buf; //This prints "Microsoft Windows [version 6.1.7601]
CloseHandle(hWriteIN);
代码无法将字符串“记事本”传递到cmd.exe,但成功启动命令外壳程序。如果我查看任务管理器,有几个命令提示符生成的实例,但没有记事本。此外,ReadFile()
函数是唯一一个似乎已经工作的函数,但它甚至不从读取管道进程(本应该生成的记事本)读取,而是从CMD读取。更糟糕的是,它会截断所有内容,只是它读取的第一行! (CMD打印“Microsoft Windows .... \ n Copyright ... \ n C:\ Users \ Foo> ... \ n”但是ReadFile()只抓取第一行)
我错过了那一个。第一次调用应该可以,但第二次调用应该是'hWINININ'而不是'hReadIN',因为'hReadIN'句柄应该被子进程继承。 – 2012-10-25 19:55:28