Ответ 1
Когда вы пишете программу WinMain, вы автоматически получаете опцию /SUBSYSTEM в качестве окон в компиляторе. (Предполагая, что вы используете Visual Studio). Для любого другого компилятора может присутствовать аналогичный параметр, но имя флага может отличаться.
Это заставляет компилятор создавать запись в формате исполняемого файла (PE-формат), который отмечает исполняемый файл как исполняемый файл Windows.
Как только эта информация присутствует в исполняемом файле, системный загрузчик, запускающий программу, будет обрабатывать ваш двоичный файл как исполняемый файл Windows, а не консольную программу, и поэтому он не вызывает автоматическое открытие окон консоли при его запуске.
Но программе Windows не нужно создавать какие-либо окна, если это не нужно, так же как и все те программы и службы, которые вы видите на панели задач, но не видите никаких соответствующих окон для них. Это также может произойти, если вы создадите окно, но не хотите его показывать.
Все, что вам нужно сделать, чтобы достичь всего этого,
#include <Windows.h>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
/* do your stuff here. If you return from this function the program ends */
}
Причина, по которой вам нужен WinMain, заключается в том, что после того, как вы пометили подсистему как Windows, линкер предполагает, что ваша функция точки входа (которая вызывается после загрузки программы и инициализации библиотеки запуска C TIM) будет WinMain, а не основной, Если вы не предоставляете WinMain в такой программе, вы получите ошибку разрешенного символа во время процесса компоновки.