Подтвердить что ты не робот

Создание приложения без окна

Как бы вы программировали приложение C/С++, которое могло работать без открытия окна или консоли?

4b9b3361

Ответ 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 в такой программе, вы получите ошибку разрешенного символа во время процесса компоновки.

Ответ 2

В окнах:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   

Обязательно используйте переключатель компоновщика /SUBSYSTEM, упомянутый Адамом Мицем.

На других платформах:

int main(int argc, char**argv)
{
  // <-- Program logic here
  return 0;
}

Ответ 3

Если вам нужно постоянно запускать свою программу без консоли или окна, вы можете найти полезные deamon on * NIX или услуги в Windows, этот пример .NET, если вам нужен простой win32 просто Google немного для образца.
 Поскольку ваш вопрос помечен как win32, я предполагаю, что услуги более релевантны для вас.

Ответ 4

В Visual Studio Express 2010 после установки подсистемы на окна (как было предложено пользователем17224), в качестве альтернативы, чтобы сменить основной на WinMain (как было предложено пользователем17224 и Брайаном Р. Бонди), можно установить функцию входа в основные свойства, linker, advanced, entry point: просто введите main в текстовое поле.

Ответ 5

Используйте мастер Visual Studio для создания приложения Win32. Но не создавайте окно, то есть вы удаляете функцию создания окна. В качестве альтернативы мы можем создать приложение Win Service.

Ответ 6

Если вы используете MSVC или Visual Studio, просто используйте новый Мастер проектов и выберите Консольное приложение.