textpub.neocities.org . [ список статей ]

Мой перевод англоязычной статьи «WinMain: The Application Entry Point» с сайта компании Microsoft (ссылка на оригинал: новая, старая), автор статьи там не указан, дата публикации оригинала: 05.10.2010 г.

WinMain: точка входа приложения

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

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

Эта функция имеет четыре параметра:

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

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

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

Как компилятор понимает, что программа начинается с вызова функции wWinMain вместо стандартной функции main? На самом деле реализацию функции main берет на себя стандартная библиотека CRT (дословно «C Run-Time», «библиотека времени исполнения программы на языке Си») компании Microsoft, а далее уже эта функция main вызывает либо функцию WinMain, либо функцию wWinMain.

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

Ниже показан код пустой функции WinMain:

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

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

textpub.neocities.org . [ список статей ]