Windows和控制台应用程序之间有什么区别?
在Visual C++中创建新项目时,它要求选择上述任一项.
唯一的区别是控制台应用程序总是会生成一个控制台,如果它没有从一个控制台启动(或者控制台在启动时被主动抑制).另一方面,Windows应用程序不会生成控制台.它仍然可以连接到一个existant控制台或使用创建一个新的控制台AllocConsole
.
这使得Windows应用程序更适合GUI应用程序或后台应用程序,因为您通常不希望为这些应用程序创建终端窗口.
从更技术性的角度来看,Console和Windows可执行文件之间的唯一区别是文件的PE头中的一个字节exe
.手动切换此字节(例如,使用十六进制编辑器)可转换应用程序类型.这是一个发布良好的hack,用于在VB6中创建控制台应用程序(此类应用程序未明确支持).
要确定和更改应用程序的子系统类型,您需要读取PE标头的部分内容.但子系统数据的地址并不固定,因为它是可选文件头的一部分,其位置由存储在DOS文件头(在成员中e_lfanew
)的地址确定.该地址实际上指向_IMAGE_NT_HEADERS
记录,而记录又包括IMAGE_OPTIONAL_HEADER32
结构.这有int16
1)成员叫Subsystem
.Windows应用程序的成员值为2,控制台应用程序的值为3.存在其他子系统(特别是POSIX和内核).我编写了一个小的VB6应用程序来更改应用程序的子系统,可以从ActiveVB下载源代码.
PE格式没有很好的文档记录,但本文档可作为介绍:PE内部对等:Win32可移植可执行文件格式之旅.
1)这与我只声称只有一个字节不同的说法并不矛盾:该成员的最高有效字节始终为0.只有最低有效字节才会发生变化.
除了Konrad提到的差异之外,从命令提示符以交互方式调用时,控制台和Windows应用程序的行为也不同:
启动控制台应用程序时,在控制台应用程序退出之前,命令提示符不会返回.当您启动Windows应用程序时,该命令立即返回.
批处理文件不是这样; 他们将一直等到应用程序退出.(您始终可以使用该start
命令启动应用程序而无需等待.)