如果我编译此源代码:
#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内部运行它,我将看到:
同时,如果我从powershell(或cmd)调用此可执行文件,则会看到:
说实话,鉴于-mwindows
表示要生成Windows可执行文件而不是控制台,我对后者并不感到惊讶-我已经看过很多次了。
但是msys2如何设法显示该输出?
答案 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
的方式类似的方式执行。