首页 文章

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

提问于
浏览
46

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

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

6 回答

  • 1

    唯一的区别是控制台应用程序总是会生成一个控制台,如果它没有从一个控制台启动(或者控制台在启动时被主动抑制) . 另一方面,Windows应用程序不会生成控制台 . 它仍然可以附加到一个existant控制台或使用 AllocConsole 创建一个新控制台 .

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

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

    要确定和更改应用程序的子系统类型,您需要读取PE标头的部分内容 . 但子系统数据的地址并不固定,因为它是可选文件头的一部分,其位置由存储在DOS文件头中的地址(在成员 e_lfanew 中)确定 . 该地址实际上指向 _IMAGE_NT_HEADERS 记录,而该记录又包括 IMAGE_OPTIONAL_HEADER32 结构 . 这有一个名为 Subsystem 的成员 . 成员's value is 2 for a Windows application and 3 for a console application. Other subsystems exist (in particular, POSIX and kernel). I'已经编写了一个小的VB6应用程序来更改应用程序的子系统,可以从ActiveVB下载源代码 .

    PE格式没有很好的文档记录,但本文档可作为介绍:Peering Inside the PE: A Tour of the Win32 Portable Executable File Format .


    1)这与我只声称只有一个字节不同的说法并不矛盾:该成员的最高有效字节始终为0.只有最低有效字节才会发生变化 .

  • 72

    除了Konrad提到的差异之外,从命令提示符以交互方式调用时,控制台和Windows应用程序的行为也不同:

    启动控制台应用程序时,在控制台应用程序退出之前,命令提示符不会返回 . 当您启动Windows应用程序时,该命令立即返回 .

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

  • 1

    不同之处在于应用程序被删除的方式 . 使用控制台模板时,您将在控制台中启动存根 . 如果您已经在控制台中运行,它将忽略调用旋转的调用 .

    出于同样的原因,Windows应用程序设计有默认表单 . 如果要清除它,可以创建一个无形的Windows窗体应用程序,它本质上是一个没有控制台窗口的控制台应用程序 .

    就应用程序的内容而言,它们基本相同 . 主要区别在于编译阶段 .

  • 16

    您可以使用EDITBIN.exe更改子系统(MSDN Entry on EDITBIN.exe

  • 2

    控制台应用程序从Windows命令行运行(start / run / cmd)

    预设了Window应用程序,以便您可以对在Windows环境中运行的GUI应用程序进行编程 .

  • 2

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

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

相关问题