Windows 应用程序分为控制台(console)应用程序和 GUI 应用程序。GUI应用程序即有图形用户界面,可以与用户在视图上进行交互的程序,而控制台(console)应用程序按照微软官方的说法是:
A console (or "terminal) is an application that provides I/O to character-mode applications. This processor-independent mechanism makes it easy to port existing character-mode applications or to create new character-mode tools and applications. A console consists of an input buffer and one or more screen buffers.
翻译为人话就是控制台(console)程序是提供了以字符为输入输出交互模式的应用程序,他没有图形操作方式,只能以键盘字符进行操作。
CreateProcess 函数提供了创建新进程的功能,该函数第六个参数 dwCreationFlags 影响了要创建的进程性质。对于创建控制台进程受影响参数是:
- NULL(未指定以下任何标志)
- CREATE_NEW_CONSOLE
- CREATE_NO_WINDOW
- DETACHED_PROCESS
当该函数第六个参数 dwCreationFlags 指定为 CREATE_NEW_CONSOLE 时,表明要创建的新进程单独拥有一个新的控制台窗口,当 dwCreationFlags 指定为 DETACHED_PROCESS 时,表示新进程不拥有控制台窗口,当 dwCreationFlags 指定为 CREATE_NO_WINDOW 时,表示要创建的控制台进程没有窗口界面。
当你要创建的进程本来就是控制台窗口时,你可以使用 CREATE_NEW_CONSOLE 将新进程作为独立的新控制台,也可以使用 CREATE_NO_WINDOW 使创建的控制台进程不显示窗口界面。但不能使用 DETACHED_PROCESS,因为 DETACHED_PROCESS 本身就表示新进程不拥有控制台窗口,而你又想创建控制台类型的进程,所以两者矛盾创建失败。
当你要创建的进程是GUI进程而非console进程时,使用以上三个参数的任意一个都不收影响,应为上面三个参数仅仅是针对控制台进程而言。
CREATE_NO_WINDOW 与 DETACHED_PROCESS 的区别是:以 CREATE_NO_WINDOW 创建的控制台进程虽然没有界面,但可以通过 AttachConsole 来访问其父进程的控制台,而以 DETACHED_PROCESS 创建的控制台进程不能与其父进程控制台交互,要想拥有控制台界面,只能通过 AllocConsole 来创建自己独立的控制台窗口。
参考资料: