msys2如何显示非控制台应用程序的控制台输出?

时间:2019-04-21 07:03:56

标签: c windows console mingw msys2

如果我编译此源代码:

#include <stdio.h>

int main(int argc, char* args[]) {
  printf("Done!\n");
  return 0;
}

使用gcc hello.c -o hello -mwindows工具链在msys2下使用mingw-w64-x86_64-toolchain,然后从msys2内部运行它,我将看到:

enter image description here

同时,如果我从powershell(或cmd)调用此可执行文件,则会看到:

enter image description here

说实话,鉴于-mwindows表示要生成Windows可执行文件而不是控制台,我对后者并不感到惊讶-我已经看过很多次了。

但是msys2如何设法显示该输出?

1 个答案:

答案 0 :(得分:1)

Windows上的控制台和GUI应用程序之间几乎没有什么区别,C运行时stdio代码通常不在乎,它只关心标准Win32句柄。

主要区别是父应用程序中CreateProcess的工作方式。

  • 如果父级具有控制台,则控制台应用程序将连接到父级标准Win32处理。如果父级没有控制台,则会为该应用程序创建一个新的控制台窗口。父级可以将可选标志传递给CreateProcess,以强制/拒绝新控制台。

  • GUI应用程序未连接到标准Win32句柄,并且未创建新控制台。

Powershell.exe是一个真实的控制台应用程序,它可以使用默认的CreateProcess处理。由于您的应用程序不是控制台应用程序,因此将在没有标准句柄的情况下创建它,因此它无处可写。

msys2终端应用程序可能不是真正的控制台应用程序,可能使用强制句柄(CreateProcess)调用STARTF_USESTDHANDLES。这些句柄可能是管道的句柄。您的应用程序会将这些句柄视为重定向的stdio句柄,并以与cmd.exe执行yourconsoleapp.exe | otherconsoleapp.exe的方式类似的方式执行。