【发布时间】:2020-12-10 00:06:47
【问题描述】:
我正在使用 Embarcadero C++ 10.2 ‘Tokyo’ 命令行编译器作为一个占用空间小的编译器,它以压缩形式分发并且易于“便携”。
我正在尝试使用 Win32 API 实现这个小的 Close Tray 程序。
#include <windows.h>
int main()
{
mciSendString("Set CDAudio Door Closed Wait", 0, 0, 0);
return 0;
}
使用bcc32c Close.cpp 编译它可以正常工作,但是当双击可执行文件时,控制台窗口会正常显示。
有没有办法像微软编译器使用的/SUBSYSTEM:WINDOWS 那样取消它的存在。
更新:例如,为了在 Digital Mars 中执行此操作,我使用 sc source.c 编译源文件,然后像这样使用其链接器 Optlink
link source.obj,,,winmm.lib /subsystem:windows
因为在 Digital Mars 中编译它是不够的,它需要链接到 winmm.lib 而 Embarcadero 的编译器会自动完成。
更新 2: 我还看到了一个选项 -tW 来使 taget 在 Windows 上可执行,但它不起作用,所以使用 bcc32x -mwindows,因为它基于 Clang 并且仍然没有无法得到所需的结果。
【问题讨论】:
-
处理这个问题的正确方法是制作一个 GUI 应用程序(
/SUBSYSTEM:WINDOWS带有WinMain())而不是控制台应用程序(/SUBSYSTEM:CONSOLE带有main()),只是不要t 在您的代码中创建任何 UI。但我不确定如何使用命令行编译器制作 GUI 应用程序。您可以使用ShowWindow(GetConsoleWindow(), SW_HIDE),但隐藏不属于您的控制台窗口并不好。 -
@RemyLebeau 您的建议会使控制台窗口在几秒钟内闪烁并消失,我正在寻找一种完全禁用它的方法。
-
只有一种方法可以正确禁用控制台,那就是根本不首先创建控制台应用程序。我建议在 C++Builder IDE 中创建一个无窗口 GUI 应用程序,然后启用其输出以显示它调用编译器的参数,然后您可以将这些设置移植到命令行编译器(或者,您可以只需使用 MSBuild 在命令行上按原样编译 IDE 项目,让它为您处理编译器的复杂性)
-
我没有IDE只有命令行编译器,你猜你是对的,这个比其他的限制更多,如果不是Windows应用程序它不会编译作为一个。 MSBuild 可能会更好,但它不是作为压缩的便携式文件夹提供的,其次,如果您不进行静态链接,它可能会添加
msvcrt依赖项。 -
C++Builder 应用不使用 msvcrt