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 都无处可去;并且控制台窗口完全空白。

这甚至可能吗?

4

1 回答 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"

请注意,如果您还不知道, SHGetFileInfowith会告诉您可执行文件是否是控制台应用程序。SHGFI_EXETYPE

于 2012-10-05T01:20:48.333 回答