プログラムのインスタンスを生成し、一部のデータをその STDIN にパイプしてから、C++ を使用してプロセスの出力を読み取る関数を作成しようとしています。私はここにある MSDN の例を見てきましたが、これはややこしいものでした。この例を使用しようとすると、厄介なエラー コードが表示され、機能しません。
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);
このコードは、文字列 "notepad" を cmd.exe にパイプすることはできませんが、コマンド シェルの起動には成功しています。タスク マネージャーを見ると、コマンド プロンプトがいくつか表示されていますが、メモ帳は表示されていません。さらに、ReadFile()
関数は機能しているように見えた唯一のものですが、パイプされたプロセス (生成されるはずだったメモ帳) からの読み取りではなく、CMD からの読み取りです。さらに悪いことに、読み取った最初の行以外はすべて切り捨てられます。(CMD は "Microsoft Windows....\n Copyright...\n C:\Users\Foo>...\n" を出力しますが、`ReadFile() は最初の行のみを取得します)