2009-02-22 115 views

回答

62

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

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

在更多技术说明中,控制台和Windows可执行文件之间的唯一区别是exe文件的PE标头中的一个字节。手动切换此字节(例如,使用十六进制编辑器)可转换应用程序类型。这是一个用于在VB6中创建控制台应用程序的良好发布的hack(其中未明确支持此类应用程序)。

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

PE格式没有很好的记录,但是这个文件可以作为一个介绍:Peering Inside the PE: A Tour of the Win32 Portable Executable File Format


1)这并没有真正否认我的要求只有一个字节的区别:此成员的最显著字节始终为0,只有至少显著字节的变化。

当您启动控制台应用程序,命令提示符不会返回到控制台应用程序退出:

+0

感谢康拉德的子系统 - 伟大的:-) – 2009-02-22 13:24:33

1

控制台应用程序从Windows命令行运行(开始/运行/ CMD)

一个窗口应用程序预设,所以你可以编写在Windows环境中运行的GUI应用程序。

15

除了由康拉德·提到的区别,在命令提示符下交互调用时控制台和Windows应用程序的行为不同。 当您启动一个Windows应用程序时,该命令立即返回。

这对于批处理文件不是这样;他们会一直等到应用程序退出。 (您始终可以使用start命令无需等待即可启动应用程序。)

2

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

同样,一个Windows应用程序是用默认的窗体设计的。如果你想清除它,你可以创建一个无窗口的Windows窗体应用程序,它本质上是一个没有控制台窗口的控制台应用程序。

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

相关问题