Точка входа в приложение WinMain

Каждая программа Windows включает функцию точки входа с именем WinMain или wWinMain. В следующем коде показана сигнатура для wWinMain:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

Ниже приведены четыре параметра wWinMain .

  • hInstance — это дескриптор экземпляра или дескриптор модуля. Операционная система использует это значение для идентификации исполняемого файла или EXE-файла при загрузке в память. Некоторым функциям Windows требуется дескриптор экземпляра, например для загрузки значков или растровых изображений.
  • hPrevInstance не имеет смысла. Он использовался в 16-разрядной версии Windows, но теперь всегда равен нулю.
  • pCmdLine содержит аргументы командной строки в виде строки Юникода.
  • nCmdShow — это флаг, указывающий, является ли основное окно приложения свернуто, развернуто или отображается в обычном режиме.

Функция возвращает int значение. Операционная система не использует возвращаемое значение, но вы можете использовать его для передачи кода состояния в другую программу.

Соглашение о вызовах, например WINAPI, определяет, как функция получает параметры от вызывающего объекта. Например, соглашение о вызовах определяет порядок отображения параметров в стеке. Обязательно объявите функцию wWinMain , как показано в предыдущем примере.

Функция WinMain аналогична функции wWinMain, за исключением того, что аргументы командной строки передаются в виде строки ANSI. Предпочтительнее использовать строку Юникода. Функцию ANSI WinMain можно использовать, даже если вы скомпилируете программу как Юникод. Чтобы получить копию аргументов командной строки в Юникоде, вызовите функцию GetCommandLine . Эта функция возвращает все аргументы в одной строке. Если вы хотите, чтобы аргументы были массивом в стиле argv, передайте эту строку в CommandLineToArgvW.

Как компилятору известно, что вместо стандартной функции mainвызывается wWinMain? Фактически библиотека среды выполнения Microsoft C (CRT) предоставляет реализацию main , которая вызывает WinMain или wWinMain.

CRT выполняет некоторые дополнительные действия внутри main. Например, он вызывает любые статические инициализаторы до wWinMain. Хотя компоновщик может использовать другую функцию точки входа, при связывании с CRT следует использовать значение по умолчанию. В противном случае код инициализации CRT пропускается, а непредсказуемые результаты, такие как некорректная инициализация глобальных объектов.

В следующем коде показана пустая функция WinMain :

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

Теперь, когда у вас есть точка входа и вы понимаете некоторые основные термины и соглашения о программировании, вы готовы создать свою первую программу Windows.