【问题标题】:bcc32 - no console subsystem and no windows subsystem alsobcc32 - 没有控制台子系统,也没有 Windows 子系统
【发布时间】:2013-04-14 12:44:43
【问题描述】:

我正在使用旧的 bcc32(borland 5.5)(我知道这很旧 编译器,但不要告诉我我不应该使用它)

我可以使用控制台或 windows 子系统进行编译。

我不想用 windows 子系统编译, 我想要只有 main() 广告的控制台 “windows.h”包括(从那里我打电话给我的 自己的库,打开窗口和句柄 消息在内部自行泵送)

它可以工作,但问题是当我编译时 带有控制台子系统有丑陋的蓝色控制台 窗口出现,我不需要那个

所以我认为我只需要编译 Windows 子系统, 没有控制台子系统编译,只是让我的 程序以某种原始模式编译(两者都没有 控制台创建并且没有 WinMain 入口点 - 怎么办?

【问题讨论】:

    标签: winapi linker c++builder


    【解决方案1】:

    一般来说,当您不需要控制台时,您应该选择“GUI”或“Windows”子系统(取决于您的开发环境选择调用它的名称)。这控制了链接​​器在您的 EXE 标头中设置的位。在程序开始运行后,您无法控制子系统,因为操作系统会读取您的 EXE 文件,并在执行程序中的任何代码之前确定要使用的子系统。

    使用 Windows 子系统不需要你有任何窗口;它只是在加载程序时告诉操作系统您不需要控制台。它与您是否使用任何 Windows API 无关。这两个子系统都是成熟的 Windows 应用程序,可充分利用 Windows API 功能。

    您可以通过WinMain 执行所有相同的操作,就像您可以通过main 执行的操作一样。有fetching the command linesplitting it into separate arguments 的函数。

    但是,如果您不希望您的 main 函数被称为 WinMain,那么您不能使用 Windows 子系统。子系统的选择还控制链接器将哪一组准备代码放入您的程序中。准备代码是程序的真正入口点所在的地方,它是初始化 C++ 标准库并调用具有命名空间范围的任何对象的构造函数的地方。控制台模式中包含的代码调用main(或wmain);为 Windows 子系统链接的代码调用 WinMain(或 wWinMain)。如果你使用Windows子系统并且没有定义一个名为WinMain的函数,那么你在链接的时候会报错;链接器将抱怨未定义的函数。 (您不必包含 windows.h 来定义 WinMain,如果包含该标头是您所害怕的。)

    由于要使用的子系统只是 EXE 标头中的一组位,因此在与 the editbin program 发生链接后更改它。链接时,选择控制台子系统,以便获得控制台准备代码和main,然后修改二进制文件以改用 Windows 子系统:

    链接 foo.obj /out foo.exe /subsystem:CONSOLE editbin /subsystem:WINDOWS foo.exe

    然后您的程序将在没有控制台的情况下运行。请注意,如果在启动时出现任何问题,准备代码可能会使您的程序崩溃,因为编写它时希望有一个可用于写入的控制台,但它不会在那里。

    【讨论】:

    • 但我强烈不想包含“windows.h”并且不想要 WinMain 入口点(我只想包含“my_own_framework.h”并有一个简单的 main() 函数) -使用 concole 子系统它工作得很好,但只是出现了这个控制台:c 我可以使用 windows 子系统并且不包括 windows h 并且不使用 WinMain - 据我记得 main() 会带来编译错误
    • @grungefightr:没有办法使用main() 入口点创建控制台应用程序,并且操作系统没有为其创建控制台窗口。您必须创建一个带有 WinMain() 入口点的 GUI 应用程序才能删除控制台窗口,无论您是否在代码中实际创建了 GUI。这就是 Windows 的工作原理。
    • 我怀疑控制台模式 exe 启动存根只是调用 CreateConsole api 调用之类的东西,不调用它对我有好处 - 这里也不需要该死的控制台和该死的 WinMain :c
    • Grunge Fightr:afaik 这些是二进制标头中的标志,而不是存根代码。您可以尝试在启动后隐藏控制台,但它可能会快速闪烁。注意 afaik 不是控制台也有其他困难,如果您不偶尔轮询消息,DrWatson(或其继任者)可能会发挥作用。与线程初始化 iirc 的控制台相同
    • @RemyLebeau 您可以在链接时覆盖SUBSYSTEM(或在之后使用editbin 更改它)。 stackoverflow.com/questions/2422430/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2011-12-06
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多