Я использую компилятор командной строки 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, и все еще не получил необходимого результата.
@RemyLebeau ваше предложение заставит окна консоли мигать и исчезать за доли секунды, я ищу способ полностью отключить его.
Есть только один способ правильно отключить консоль — просто не создавать консольное приложение. Я бы предложил создать приложение с графическим интерфейсом без окон в C++Builder IDE, а затем включить его вывод, чтобы показать параметры, с которыми он вызывает компилятор, а затем вы можете перенести эти настройки в компилятор командной строки (или вы можете просто скомпилируйте проект IDE как есть в командной строке с помощью MSBuild и позвольте ему справиться со сложностями компилятора за вас)
У меня нет IDE, только компилятор командной строки, думаю, вы правы, этот более ограниченный, чем другие, если это не приложение Windows, оно не будет компилироваться как единое целое. MSBuild может быть лучше, но он не поставляется в виде сжатой переносимой папки, во-вторых, он может добавить зависимость msvcrt
, если вы не выполняете статическое связывание.
Приложения C++Builder не используют msvcrt
Я говорю о MSBuild.
MSBuild — это просто структура цепочки сборки. Он просто вызывает любой настроенный компилятор и компоновщик. Что важно, так это среда выполнения, которую используют компилятор и компоновщик, а среда выполнения C++Builder не использует msvcrt. Это зависимость Visual Studio.
Вы можете попробовать
#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 КБ для Цифровой Марс.
Спасибо, отредактировал ответ с изменением командной строки.
Правильный способ справиться с этим — создать приложение с графическим интерфейсом (
/SUBSYSTEM:WINDOWS
сWinMain()
) вместо консольного приложения (/SUBSYSTEM:CONSOLE
сmain()
) и просто не создавать никакого пользовательского интерфейса в коде. Но как сделать приложение с графическим интерфейсом с помощью компилятора командной строки, я не уверен. Вы можете использоватьShowWindow(GetConsoleWindow(), SW_HIDE)
, но нехорошо скрывать окно консоли, которым вы не владеете.