Windows和控制台应用程序之间的区别
唯一的区别是,如果控制台应用程序不是从一个控制台启动(或者在启动时主动禁用控制台),则该控制台应用程序始终会生成控制台。另一方面,Windows应用程序不生成控制台。它可以仍附加到一个存在的控制台或使用AllocConsole
创建一个新的控制台。
这使得Windows应用程序更适合GUI应用程序或后台应用程序,因为您通常不希望为这些应用程序创建终端窗口。
在更多技术说明中,控制台和Windows可执行文件之间的唯一区别是exe
文件的PE标头中的一个字节。手动切换此字节(例如,使用十六进制编辑器)可转换应用程序类型。这是一个用于在VB6中创建控制台应用程序的良好发布的hack(其中未明确支持此类应用程序)。
要确定和更改应用程序的子系统类型,您需要阅读PE标头的各个部分。子系统数据的地址不是固定的,因为它是可选文件头的一部分,其位置由存储在DOS文件头中的地址(在成员e_lfanew
中)确定。该地址实际上指向_IMAGE_NT_HEADERS
记录,该记录又包括IMAGE_OPTIONAL_HEADER32
结构。这有一个int16
1)成员称为Subsystem
。 Windows应用程序的成员值为2,控制台应用程序的成员值为3。其他子系统存在(特别是POSIX和内核)。 我已经写了一个小的VB6应用程序来更改应用程序的子系统,它可以从ActiveVB作为源代码下载。
PE格式没有很好的记录,但是这个文件可以作为一个介绍:Peering Inside the PE: A Tour of the Win32 Portable Executable File Format。
1)这并没有真正否认我的要求只有一个字节的区别:此成员的最显著字节始终为0,只有至少显著字节的变化。
当您启动控制台应用程序,命令提示符不会返回到控制台应用程序退出:
控制台应用程序从Windows命令行运行(开始/运行/ CMD)
一个窗口应用程序预设,所以你可以编写在Windows环境中运行的GUI应用程序。
除了由康拉德·提到的区别,在命令提示符下交互调用时控制台和Windows应用程序的行为不同。 当您启动一个Windows应用程序时,该命令立即返回。
这对于批处理文件不是这样;他们会一直等到应用程序退出。 (您始终可以使用start
命令无需等待即可启动应用程序。)
区别在于应用程序已被删除。当您使用控制台模板时,您将有一个存根将在控制台中启动。如果您已经在控制台中运行,它将忽略打开一个控制台的呼叫。
同样,一个Windows应用程序是用默认的窗体设计的。如果你想清除它,你可以创建一个无窗口的Windows窗体应用程序,它本质上是一个没有控制台窗口的控制台应用程序。
就应用程序的胆量而言,它们本质上是一样的。主要区别是在编译阶段添加。
感谢康拉德的子系统 - 伟大的:-) – 2009-02-22 13:24:33