Любая программа имеет точку входа. То есть то место откуда непосредственно начинается Ваша программа. В языке С - это функция, в которую будет передано управление сразу после запуска программы. Не зря я говорю о запуске. Прежде чем будет выполняться Ваш код операционная система должна сделать много всего. Прочитать программу с диска, выделить ей память, настроить сегменты данных и кода, сама программа должна проверить операционную систему и выполнить ряд действий. Вот только после проведения всех необходимых настроек управление будет передано Вашим командам. В случае программирования для Windows это будет функция WinMain. Она вот такая:
int WINAPI WinMain ( HINSTANCE hInstance, // указатель на текущий экземпляр HINSTANCE hPrevInstance, // указатель на предыдущйи запушенный экземпляр LPSTR lpCmdLine, // командная строка int nCmdShow // тип отображения окна программы );
Определена она в windows.h. Давайте посмотрим параметры. Первый параметр - это указатель на саму программу, каждая программа при запуске получает уникальный идентификатор, Windows просто передает его Вам. Второй - должен указывать на экземпляр программы, который был запущен ранее. В WIN32 - этот параметр всегда равен NULL, в WIN31 было иначе. То есть он не нужен. Что делать, если нужно определять все-таки запущен другой экземпляр или нет ? Использовать семафоры CreateMutex(). Чтобы получить представление о том, как это делается смотрите "Шаг 9 - Синхронизация файловых операций Mutex". Следующий параметр - это командная строка, как указатель на последовательность символов оканчивающихся нулем. Ее извлекать лучше с помощью GetCommandLine(). Последний параметр - это тип отображения окна, то есть совет Windows как окну надо отобразиться. Как известно советы бывают всякие черные, белые, красные и так далее. Дело в том, что у пользователя есть возможность указать как он хочет запустить программу, допустим, если он удерживает клавишу SHIFT, то программа должна запускаться в минимизированном виде. Проверьте на блокноте (notepad.exe), если не верите. У значков программ через ПУСК есть таже возможность указатель, как запускать.
Вернуть WinMain должна результат своей работы. Но на самом деле Windows никогда не проверяет это значение. В DOS - это значение можно было проверять в BAT файлах, анализируя результат выполнения. Я писал диплом в Институте как раз примерно про это. То есть как в DOS организовать автоматические цепочки обработки информации. Сложность реальная была одна, как узнать результат работы другой программы. Вот и было два выхода - это стандартный файл с отчетом о работе и кода завершения. Используя и то и другое вроде как-то получалось. Вообще программа для Windows должна завершаться когда получит сообщение WM_QUIT. Это сообщение может послать как пользователь, зарыв главное окно, так и операционная система, например, при снятии задачи или завершении работы. Обратите внимание на то, что в WINAPI именно такое правило передачи параметров через стек.
Примеры применения ее для программирования на С смотрите в шагах: