如何在启动时重定向stderr *而不重定向stdin和stdout?

时间:2012-10-04 17:21:59

标签: windows platform-sdk

在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,则子进程对stdin和stdout具有INVALID_HANDLE_VALUE;所有读取失败;所有的printf都无处可去;并且控制台窗口完全空白。

这甚至可能吗?

1 个答案:

答案 0 :(得分: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"

请注意,带有SHGFI_EXETYPE的{​​{3}}会告诉您可执行文件是否为控制台应用程序(如果您还不知道)。