尝试在 Windows 上重定向 stdout 和 stderr - _fileno(stdout) 返回 -2

Plu*_*uin 4 c++ windows pipe

这是我在这里的第一个问题!

我即将将一些工作良好的 C++ 代码从 UNIX 移植到 Windows,它通过管道将 stdout 和 stderr 重定向到自定义 GUI 组件。我需要它来显示来自第三方库的反馈,该库仅将消息输出到我的 GUI 上的 stdout。

根据这个答案/sf/answers/43201091/这应该有效。事实上,链接中的代码在使用 Visual Studio 2017 构建的新命令行应用程序中按预期工作。但是在我现有的 GUI 应用程序中,对 的调用_fileno(stdout)以及对_fileno(stderr)两者的调用都返回 -2 而不是预期值 1 和 2,所以只需什么都没有发生。对相关函数进行硬编码 1 和 2 也不起作用。

所以谁能解释一下

  • 返回值 -2 究竟意味着什么?(谷歌搜索了很多 - 没有成功)
  • 如果甚至有可能在没有控制台的应用程序中实现我想要的 Windows 应用程序?
  • 如果可能的话,让它工作的相关步骤是什么?

供您参考,我收集了迄今为止在 Linux 和 Mac OS 上编程的主要经验,因此对于经验丰富的 Windows 人员来说,这可能是显而易见的。GUI 应用程序基于 JUCE 框架,因此我使用的是由 JUCE 工具 Projucer 创建的自动生成的 Visual Studio 项目

Dod*_*ion 5

与 Unix 类型的系统不同,在 Windows 中,控制台应用程序和 GUI 应用程序是两种不同的东西。GUI 应用程序没有 stdin、stdout 或 stderr 的概念——它们只知道窗口、文本框等。

_fileno文档说

如果 stdout 或 stderr 未与输出流关联(例如,在没有控制台窗口的 Windows 应用程序中),则返回的文件描述符为 -2。

因此,如果要使用 stdout 和 stderr,则需要将应用程序构建为控制台应用程序(您仍然可以使用 GUI)。

另一种方法是继续将应用程序构建为 GUI,但通过在应用程序的最开始调用AllocConsole()分配一个控制台(即您在 中执行的第一件事WinMain()),然后关联 stdout 和 stderr 文件:

if(AllocConsole()){
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
}
Run Code Online (Sandbox Code Playgroud)