Скрыть окна консоли в C++ Builder

Я использую компилятор командной строки Embarcadero C++ 10.2 «Tokyo» в качестве небольшого компилятора, он распространяется в сжатой форме и легко «переносим».

Я пытаюсь реализовать эту небольшую Close Tray программу, используя Win32 API.

#include <windows.h>

int main()
{
  mciSendString("Set CDAudio Door Closed Wait", 0, 0, 0); 
  return 0;
}

Компиляция с помощью bcc32c Close.cpp работает нормально, но окно консоли появляется, как и должно, при двойном щелчке исполняемого файла. Есть ли способ отменить его присутствие, как /SUBSYSTEM:WINDOWS, который используется с компилятором Microsoft.

Обновление: например, чтобы сделать это в 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, и все еще не получил необходимого результата.

Правильный способ справиться с этим — создать приложение с графическим интерфейсом (/SUBSYSTEM:WINDOWS с WinMain()) вместо консольного приложения (/SUBSYSTEM:CONSOLE с main()) и просто не создавать никакого пользовательского интерфейса в коде. Но как сделать приложение с графическим интерфейсом с помощью компилятора командной строки, я не уверен. Вы можете использовать ShowWindow(GetConsoleWindow(), SW_HIDE), но нехорошо скрывать окно консоли, которым вы не владеете.

Remy Lebeau 10.12.2020 03:24

@RemyLebeau ваше предложение заставит окна консоли мигать и исчезать за доли секунды, я ищу способ полностью отключить его.

user10191234 11.12.2020 00:53

Есть только один способ правильно отключить консоль — просто не создавать консольное приложение. Я бы предложил создать приложение с графическим интерфейсом без окон в C++Builder IDE, а затем включить его вывод, чтобы показать параметры, с которыми он вызывает компилятор, а затем вы можете перенести эти настройки в компилятор командной строки (или вы можете просто скомпилируйте проект IDE как есть в командной строке с помощью MSBuild и позвольте ему справиться со сложностями компилятора за вас)

Remy Lebeau 11.12.2020 03:59

У меня нет IDE, только компилятор командной строки, думаю, вы правы, этот более ограниченный, чем другие, если это не приложение Windows, оно не будет компилироваться как единое целое. MSBuild может быть лучше, но он не поставляется в виде сжатой переносимой папки, во-вторых, он может добавить зависимость msvcrt, если вы не выполняете статическое связывание.

user10191234 11.12.2020 08:19

Приложения C++Builder не используют msvcrt

Remy Lebeau 11.12.2020 08:20

Я говорю о MSBuild.

user10191234 11.12.2020 08:21

MSBuild — это просто структура цепочки сборки. Он просто вызывает любой настроенный компилятор и компоновщик. Что важно, так это среда выполнения, которую используют компилятор и компоновщик, а среда выполнения C++Builder не использует msvcrt. Это зависимость Visual Studio.

Remy Lebeau 11.12.2020 08:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
588
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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**, второй, флаг -tW с bcc32c, так как bcc32 не существует в этой версии, также размер исполняемого файла составляет 61 КБ по сравнению с 30 КБ для GCC и 12 КБ для Цифровой Марс.

user10191234 11.12.2020 07:54

Спасибо, отредактировал ответ с изменением командной строки.

Baxter 12.12.2020 06:59

Другие вопросы по теме