首页 文章

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

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

这甚至可能吗?

1 回答

  • 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 将告诉您可执行文件是否是控制台应用程序,如果您还不知道 .

相关问题