Точка входа в приложение 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.