Skip to main content
 首页 » 编程设计

visual-c++之Windows 和控制台应用程序之间的区别

2024年05月22日19del

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

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

请您参考如下方法:

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

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

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

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

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

<小时 />

1) 这并不真正与我的说法相矛盾,即只有一个字节不同:该成员的最高有效字节始终为 0。只有最低有效字节发生变化。