2012-10-04 79 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

所以基本上,没有办法重定向个别流。它要么全部要么没有? –

相关问题