2012-10-04 217 views
2

在Windows中,我想使用CreatePipe和CreateProcess啓動一個進程,並捕獲寫入到stderr的文本。如何在啓動時重定向標準錯誤*不重定向標準輸入和標準輸出?

有一個在MSDN示例代碼在這裏: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

我的問題是我想重定向並捕獲STDERR,而是獨自離開STDIN和STDOUT。讓他們仍然被綁定到子進程的控制檯窗口。 (如果子進程是一個控制檯程序,而不是一個窗口過程。)

如果我按照示例代碼,並設置STARTUPINFO.hStdError我的管道句柄,並設置STARTUPINFO.hStdOutput和STARTUPINFO.hStdInput到INVALID_HANDLE_VALUE,然後子進程的INVALID_HANDLE_VALUE爲stdin和stdout;所有讀取失敗;所有的printf都無處可去;並且控制檯窗口完全空白。

這甚至可能嗎?

回答

0

這應該工作:

STARTUPINFO.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
STARTUPINFO.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 

另外,如果你不能給父進程控制檯,您可以設置hStdOutput和hStdInput到INVALID_HANDLE_VALUE,並通過調用CMD.EXE如下:

cmd /c "subprocess.exe > con < con" 

請注意,SHGetFileInfoSHGFI_EXETYPE會告訴您,如果您還不知道可執行文件是否爲控制檯應用程序,

+0

我應該更清楚一點:執行啓動的過程沒有控制檯。 –

+0

您需要先使用AllocConsole分配一個。然後你可以使用GetStdHandle,如圖所示。 –

+0

所以基本上,沒有辦法重定向個別流。它要麼全部要麼沒有? –