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


39

Windows和控制台应用程序之间有什么不同?

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

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

感谢康拉德的子系统 - 伟大的:-) 22 2月. 092009-02-22 13:24:33

  0

@Rakesh,你应该接受他的解决方案,如果你喜欢它,它是答案旁边的小V。 22 2月. 092009-02-22 13:27:07

  0

@Olafur,请问在答案旁边的小V旁边,价值'4'的重要性是什么? 22 2月. 092009-02-22 13:29:21

  0

这就是“赞成票”的数量 - 4个人(5个投票)已经投票支持这个答复。 22 2月. 092009-02-22 13:36:16

  0

问题旁边的“2”是什么? 22 2月. 092009-02-22 13:39:15

  0

引用的DLLs中没有差异吗? 22 2月. 092009-02-22 13:40:13

  0

@Rakesh - 没有upvotes为您的问题 22 2月. 092009-02-22 13:40:39

  0

@SoapBox:查看更新的答案。地址不固定,必须计算。我发布了一些VB6代码的链接来读取这些数据。 MSDN文章还展示了如何做到这一点。 22 2月. 092009-02-22 16:15:27

  0

我的父亲曾经用一个自定义程序替换链接器,该程序改变了相应文件中的链接器命令行,然后在其上运行实际的链接器。最终结果与切换可执行文件中的字节相同,当然:) 31 5月. 132013-05-31 05:10:53


1

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

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


15

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

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


2

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

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

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


1

消息循环也是区别之一:

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


2

您可以更改与EDITBIN.exe(MSDN Entry on EDITBIN.exe