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

时间:2009-02-22 13:17:36

标签: visual-c++

Windows和控制台应用程序之间有什么区别?

在Visual C ++中创建新项目时,它要求选择上述任一项。

7 个答案:

答案 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)

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

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

答案 6 :(得分:1)

控制台应用程序的入口点是wmain(自Visual Studio 2008 IIRC起),main(如果您选择默认情况下不使用Unicode)。对于台式机,则为wWinMain / WinMain

这并不是说这些技术是互斥的。控制台应用程序仍然可以使用Win32 API的全部范围,而桌面应用程序可以使用控制台I / O(但必须首先显式创建控制台窗口)。