我正在嘗試創建一個函數,該函數將產生一個程序實例,然後將一些數據輸入到它的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