Windows和控制台应用程序之间的区别

Windows和控制台应用程序有什么不同?

在Visual C ++中创build一个新项目时,它会要求select上述任一项。

唯一的区别是,如果控制台应用程序不是从一个控制台启动(或者在启动时主动禁用控制台),则控制台应用程序始终会生成一个控制台。 另一方面,Windows应用程序不生成控制台。 它仍然可以连接到一个存在的控制台,或使用AllocConsole创build一个新的控制台。

这使Windows应用程序更适合于GUI应用程序或后台应用程序,因为您通常不希望为这些应用程序创buildterminal窗口。

在更多的技术说明中,控制台和Windows可执行文件唯一的区别是exe文件的PE头中有一个字节 。 手动切换此字节(例如,使用hex编辑器)将转换应用程序types。 这是一个用于在VB6中创build控制台应用程序(在这种types的应用程序没有明确支持的情况下)发布的黑客。

要确定和更改应用程序的子系统types,您需要阅读PE标题的部分内容。 子系统数据的地址并不是固定的,因为它是可选文件头的一部分,其位置由存储在DOS文件头(在成员e_lfanew )中的地址决定。 该地址实际上指向_IMAGE_NT_HEADERSlogging,而该logging又包括IMAGE_OPTIONAL_HEADER32结构。 这有一个叫做Subsystemint16 1)成员。 Windows应用程序的成员值为2,控制台应用程序的值为3。 还有其他子系统(特别是POSIX和内核)。 我写了一个小的VB6应用程序来更改应用程序的子系统,可以从ActiveVB作为源代码下载。

PE格式没有很好的logging,但是这个文档可以作为一个介绍: PE内部对等:一个Win32可移植可执行文件格式的浏览 。


1)这与我声称只有一个字节不同:这个成员的最高有效字节总是0并不矛盾。只有最低有效字节发生变化。

除Konrad提到的区别之外,当从命令提示符交互调用控制台和Windows应用程序时,其行为会有所不同:

当您启动一个控制台应用程序时,命令提示符不会返回,直到控制台应用程序退出。 当您启动一个Windows应用程序时,该命令立即返回。

batch file不是这样; 他们会一直等到应用程序退出。 (您始终可以使用start命令启动应用程序,而无需等待。)

不同之处在于应用程序被删除。 当您使用控制台模板时,您有一个存根将在控制台中启动。 如果您已经在控制台中运行,则忽略打开一个控制台的呼叫。

同样的道理,一个Windows应用程序是用默认的表单devise的。 如果你想清除它,你可以创build一个无窗口的Windows窗体应用程序,它基本上是一个没有控制台窗口的控制台应用程序。

就应用程序的胆量而言,它们本质上是一样的。 主要区别是在编译阶段添加。

您可以使用EDITBIN.exe(EDITBIN.exe上的MSDN条目 )更改子系统。

控制台应用程序从Windows命令行运行(start / run / cmd)

Windows应用程序已预设,因此您可以编写在Windows环境中运行的GUI应用程序。

消息循环也是其中的一个区别:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows