【问题标题】:Hide console windows in C++ Builder在 C++ Builder 中隐藏控制台窗口
【发布时间】: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

标签: compilation c++builder


【解决方案1】:

你可以试试

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
               LPSTR lpCmdLine, int CmdShow) {
               
  mciSendString("Set CDAudio Door Closed Wait", 0, 0, 0);

  
  return 0;
}

在命令行编译器上编译

bcc32 -W winmain.c

我不知道这个开关是否适用于你的编译器。

更新:WinMain参数如果不需要可以省略。

int WINAPI WinMain() {

【讨论】:

  • 可以,但是有些注释,你忘记了一个字母Set CDAudio Door close**d**,第二个,标志是-tWbcc32c,因为bcc32在这个版本中不存在,可执行文件的大小为 61KB,而 GCC 为 30KB,Digital Mars 为 12KB。
  • 谢谢,通过更改命令字符串编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2011-04-20
  • 2019-07-22
  • 2012-10-14
  • 2010-10-10
  • 2018-01-14
相关资源
最近更新 更多