【问题标题】:Temporarily capture stdout of a console app in Windows在 Windows 中临时捕获控制台应用程序的标准输出
【发布时间】:2012-08-09 05:54:45
【问题描述】:

是否可以(如果可以,如何?)将stdout(以及可选的stderr)临时重定向到一个文件,然后恢复原来的stdout

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

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

【问题讨论】:

  • 如果您只想要子进程的标准输出,那么 Windows 上的 CRT 似乎有一个 _popen() 可以简单地处理这种情况。
  • 嗯,实际上这对于程序的不同部分来说很棒,谢谢!

标签: c winapi


【解决方案1】:

在 Windows 上,保留文件名“CON”表示控制台输出流。要在 Windows 上恢复正常的 STDOUT 行为,您需要做的就是调用

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

【讨论】:

  • 如果这个进程作为一个子进程运行,并且它的标准输出应该被捕获怎么办? CON 会指向重定向的标准输出吗?
  • 没有。这将始终将其重新路由到控制台 I/O 流。我将尝试使用谷歌搜索保留原始 STDOUT 的方法。
  • 您是否需要一个特定于 Windows API 的解决方案? _dup()_dup2()_fileno() 工作正常
  • 这个答案应该固定在stackoverflow上,我搜索了大约4个小时,尝试了很多方法,这是唯一提到的CON魔法!谢谢!!!
【解决方案2】:

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

编辑

请参阅以下 StackOverflow 帖子。

Redirect stdout to an edit control (Win32)

practical examples use dup or dup2

【讨论】:

  • SetStdHandle 的问题在于它将输出重新路由到与freopen() 不同的级别,因此不会恢复更改。
  • 一些额外的搜索让我找到了_get_osfhandle(_fileno(filestream)),它将把句柄返回到一个文件流,然后你可以在SetStdHandle()中使用它。对我来说似乎是一个可行的解决方案,只使用 Windows 特定功能;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多