Windows和控制台应用程序之间有什么区别?
在Visual C ++中创建新项目时,它要求选择上述任一项。
答案 0 :(得分:73)
唯一的区别是,如果控制台应用程序未从一个控制台启动(或者在启动时主动抑制控制台),则控制台应用程序始终生成控制台。另一方面,Windows应用程序不会生成控制台。它可以仍附加到一个存在的控制台或使用AllocConsole
创建一个新控制台。
这使Windows应用程序更适合GUI应用程序或后台应用程序,因为您通常不希望为这些应用程序创建终端窗口。
从更技术性的角度来看,控制台和Windows可执行文件之间的唯一区别是{{1>}文件的PE标头中的一个字节。手动切换此字节(例如,使用十六进制编辑器)可转换应用程序类型。这是一个发布良好的hack,用于在VB6中创建控制台应用程序(此类应用程序未明确支持)。
要确定和更改应用程序的子系统类型,您需要读取PE标头的部分内容。但子系统数据的地址并不固定,因为它是可选文件头的一部分,其位置由存储在DOS文件头中的地址(在成员exe
中)确定。该地址实际上指向e_lfanew
记录,而该记录又包含_IMAGE_NT_HEADERS
结构。这有一个名为IMAGE_OPTIONAL_HEADER32
的{{1}} 1)成员。 Windows应用程序的成员值为2,控制台应用程序的值为3。存在其他子系统(特别是POSIX和内核)。
我编写了一个小的VB6应用程序来更改应用程序的子系统,可以从ActiveVB下载源代码。
PE格式没有很好的文档记录,但本文档可作为介绍:Peering Inside the PE: A Tour of the Win32 Portable Executable File Format。
1)这与我声称只有一个字节不同的说法并不矛盾:该成员的最高有效字节始终为0.只有最低有效字节才会发生变化。
答案 1 :(得分:17)
除了Konrad提到的差异之外,从命令提示符以交互方式调用时,控制台和Windows应用程序的行为也不同:
启动控制台应用程序时,在控制台应用程序退出之前,命令提示符不会返回。 当您启动Windows应用程序时,该命令立即返回。
批处理文件不是这样;他们将一直等到应用程序退出。 (您始终可以使用start
命令启动应用程序而无需等待。)
答案 2 :(得分:2)
区别在于应用程序被删除的方式。使用控制台模板时,您将在控制台中启动存根。如果您已经在控制台中运行,它将忽略调用旋转的调用。
出于同样的原因,Windows应用程序设计有默认表单。如果要清除它,可以创建一个无窗体的Windows窗体应用程序,它本质上是一个没有控制台窗口的控制台应用程序。
就应用程序的内容而言,它们基本相同。在编译阶段增加了主要区别。
答案 3 :(得分:2)
您可以使用EDITBIN.exe(MSDN Entry on EDITBIN.exe)
更改子系统答案 4 :(得分:1)
控制台应用程序从Windows命令行(start / run / cmd)运行
预设了一个Window应用程序,因此您可以对在Windows环境中运行的GUI应用程序进行编程。
答案 5 :(得分:1)
答案 6 :(得分:1)
控制台应用程序的入口点是wmain
(自Visual Studio 2008 IIRC起),main
(如果您选择默认情况下不使用Unicode)。对于台式机,则为wWinMain
/ WinMain
。
这并不是说这些技术是互斥的。控制台应用程序仍然可以使用Win32 API的全部范围,而桌面应用程序可以使用控制台I / O(但必须首先显式创建控制台窗口)。