Запуская приложение, мы фактически передаем управление программам Windows, которые загружают в память нашу программу и вызывают из нее главную функцию приложения, которая должна иметь имя WinMain() и описатель WINAPI (эквивалентный far pascal). Вызывая функцию WinMain(), Windows передает ей четыре обусловленные параметра.
Первый параметр типа HINSTANCE, поступающий в локальную переменную hInstance, представляет собой дескриптор данного экземпляра приложения. Он назначается приложению при его запуске системой Windows и служит для его идентификации. Многие функции Windows используют этот дескриптор в качестве входного параметра, поэтому в дальнейшем мы будем сохранять его в соответствующей глобальной переменной. В данной программе сохранение hInstance не предусмотрено. Второй параметр того же типа (локальная переменная hPrevInstance) является дескриптором предыдущего экземпляра этого же приложения и имеет смысл, если приложение запускается в нескольких экземплярах. Если предыдущие экземпляры отсутствуют, т. е. приложение запущено в единственном экземпляре, этот параметр равен 0. Анализ аргумента hPrevInstance позволяет определить, является ли данный экземпляр приложения единственным. Эта методика будет описана ниже.
Следующий параметр представляет собой дальний указатель на строку, содержащую параметры командной строки запуска приложения, если при его запуске были указаны какие-либо параметры. Поскольку мы не предполагаем запускать наше приложение с параметрами, и этот аргумент функции WinMain() нам не нужен, в заголовке функции указан его тип LPSTR, а сам аргумент пропущен.
Наконец, последний параметр nCmdShow характеризует режим запуска. Режим запуска можно установить, если, создав ярлык для нашего приложения, открыть для него окно Свойства, перейти на вкладку Ярлык и раскрыть список Окно. Если далее выбрать в этом списке пункт Свернутое в значок, Windows, запуская приложение, будет свертывать его в пиктограмму. В этом случае из Windows в WinMain() поступает значение nCmdShow, равное символической константе SW_SHOWMINNOACTIVE=7. Если же включен режим Стандартный размер, окно приложения на экране развертывается до заданного в самом приложении размера, а в WinMain() поступает константа SW_SHOWNORMAL=1. Полученное значение nCmdShow используется затем в качестве параметра при вызове функции Windows ShowWindow(), хотя в ShowWindow() можно передать и любое другое допустимое значение параметра, например, SW_SHOWMAXIMIZE, если желательно развернуть окно приложения на весь экран.
Разумеется, имена локальных аргументов для функции WinMain(), как и для любой другой функции, пользователь может выбирать по своему усмотрению.
В типичном приложении Windows главная функция WinMain() должна выполнить, по меньшей мере, три важнейших процедуры:
Зарегистрировать в Windows класс главного окна. Если помимо главного окна планируется выводить на экран внутренние, порожденные окна, то их классы тоже регистрируются. Windows выводит на экран и обслуживает только зарегистрированные окна.
Создать главное окно и показать его на экране. Порожденные окна также необходимо создать, хотя это можно сделать и позже и не обязательно в функции WinMain().
Организовать цикл обработки сообщений, поступающих в приложение. Вся дальнейшая жизнь приложения будет, фактически, состоять в бесконечном выполнении этого цикла и обработке поступающих в приложение сообщений. Запущенное приложение Windows обычно функционирует до тех пор, пока пользователь не подаст команду его завершения, что приведет к завершению главной функции и удалению приложения из списка действующих задач.
Функция WinMain() после своего завершения возвращает в Windows целочисленный результат, который системой не анализируется, но может быть использован при отладке программы, поскольку интерактивный отладчик tdw.exe после завершения отлаживаемой программы выводит на экран возвращаемое функцией WinMain() значение.