2012-08-13 100 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

相關問題