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

2023-11-22

这是我的第一个问题!

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

根据这个答案https://stackoverflow.com/a/617158这应该有效。事实上,链接中的代码在使用 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项目


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

The _fileno 的文档说:

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

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

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

if(AllocConsole()){
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在 Windows 上重定向 stdout 和 stderr - _fileno(stdout) 返回 -2 的相关文章

随机推荐