2012-08-13 54 views
1

是否有可能(如果有,如何?)将stdout(和可选的stderr)临时重定向到一个文件,然后恢复原来的stdout在Windows中暂时捕获控制台应用程序的stdout

在POSIX环境中,我使用dupdup2来存储和替换STDOUT_FILENOfreopen不是一个好的解决方案,因为stdout不能以这种方式恢复。

是否可以使用Windows API执行此操作?我相信可以使用类似POSIX的功能_DUP_DUP2。有没有不涉及他们的解决方案?

+0

如果你只是想要一个子进程的标准输出,然后好像Windows上的CRT有一个[_popen()](http://msdn.microsoft.com/en- us/library/96ayss4b(v = vs.110).aspx),它将简单地处理这种情况。 – BrendanMcK 2012-08-17 09:33:24

+0

嗯,其实这是真棒的程序的不同部分,谢谢! – Tordek 2012-08-17 09:39:31

回答

2

看看在SetStdHandle的Win32 API。此外,_dup and _dup2可用。

编辑

请参见下面的StackOverflow的帖子。

Redirect stdout to an edit control (Win32)

practical examples use dup or dup2

+0

SetStdHandle的问题在于它重新路由输出的级别不同于''freopen因此不会恢复更改。 – Kaslai 2012-08-13 01:06:15

+0

一些额外的搜索导致我''_get_osfhandle(_fileno(filestream))''这将把HANDLE返回到一个文件流,然后你可以在''SetStdHandle()''中使用它。对我来说似乎是一个可行的解决方案,只使用Windows特定的功能;) – Kaslai 2012-08-13 01:13:59

0

在Windows上,保留文件名“CON”表示控制台输出流。为了重新获得在Windows正常的STDOUT行为,所有你需要做的就是调用

freopen("CON","w",stdout); 
+0

如果此进程作为子进程运行,并且它的stdout应该被捕获,该怎么办? CON会指向重定向的标准输出吗? – Tordek 2012-08-13 00:50:08

+0

否。这将始终将其重新路由到控制台I/O流。我会尝试使用Google搜索保留原始标准输出的方法。 – Kaslai 2012-08-13 00:53:41

+0

您为什么需要Windows API特定解决方案有什么意义? ''_dup()'',''_dup2()''和''_fileno()''工作得很好 – Kaslai 2012-08-13 01:07:28

相关问题