Как я могу написать приложение для Windows без использования WinMain?

StackOverflow https://stackoverflow.com/questions/564576

  •  05-09-2019
  •  | 
  •  

Вопрос

Приложения Windows с графическим интерфейсом, написанные на C/C++, имеют в качестве точки входа «WinMain» (а не «main»).Насколько я понимаю, компилятор генерирует «основную» функцию, которая будет вызываться средой выполнения C.Эта «основная» функция устанавливает необходимую среду для графического интерфейса и вызывает «WinMain» (указывая дескрипторы экземпляра и т. д.).

Короче говоря, я считаю, что запуск консольного и графического приложения различается следующим образом:

Консольное приложение:C Runtime -> «основная» функция (написанная вручную)

Приложение с графическим интерфейсом:Среда выполнения C --> функция main (созданная компилятором) --> функция WinMain (написанная вручную)

Я хотел бы подтвердить это понимание и выяснить, как я могу вручную закодировать графический интерфейс Windows, используя только «основную» функцию (т. е.без необходимости писать WinMain).

Это было полезно?

Решение

У вас неправильное понимание.Разница между main и WinMain, за исключением некоторого другого кода инициализации, заключается в передаваемых ему параметрах.

главное выглядит так:

int main(int argc, char* argv[]);

А WinMain выглядит так:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

Что-то должно настроить эти параметры и выполнить вызов, и это код запуска.Когда вы компилируете и связываете программу, одним из параметров компоновщика является точка входа, и это будет, в зависимости от консоли или приложения с графическим интерфейсом, другой бит кода запуска.

Вы, конечно, можете написать свой собственный код запуска, просто зайдите в исходный каталог Visual C++ и найдите код запуска, он называется crt0.c и находится в каталоге VC\crt\src.

Другие советы

Используя Just main, вы не сможете кодировать Winmain.В обоснование следующие утверждения были взяты из http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx

В программировании Windows] Почему точка записи приложения не называется Main?Что ж, во -первых, название Main уже было принято, и у Windows не было полномочий зарезервировать альтернативное определение.В то время не было комитета по стандартизации языка C;C был тем, что сказал Деннис, и вряд ли гарантировано, что Деннис предпримет какие -либо особые шаги для сохранения совместимости исходного кода Windows в любой будущей версии языка C.Поскольку K & R не указал, что реализации могут расширить приемлемые формы основной функции, вполне возможно, что существует юридический компилятор C, который отклонил программы, которые неверно объявили основные.Текущий язык C Язык явно разрешает альтернативные определения, специфичные для реализации для Main, но требует, чтобы все компиляторы поддерживали эту новую версию, специфичную для Windows, для компиляции программ Windows будут безвозмездно ограничивать набор компиляторов, которые вы можете использовать для написания программ Windows.

Если бы вам удалось преодолеть это препятствие, у вас будет проблема, что версия Main Windows должна быть чем -то вроде этого:

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);

Из -за того, как была выполнена связь C, все вариации функции должны были договориться о параметрах, которые у них были общие.Это означает, что версия Windows должна была бы добавить свои параметры в конце самой длинной существующей версии Main, и тогда вам придется пересечь пальцы и надеяться, что язык C никогда не добавил еще одну альтернативную версию Main.Если вы пошли по этому маршруту, ваши скрещенные пальцы подвели вас, потому что оказывается, что третий параметр был добавлен в основное время спустя, и он противоречит вашей версии, дружелюбной для Windows.

Предположим, вам удалось убедить Денниса не разрешать эту трехпараметрическую версию Main.Вам все еще нужно придумать эти первые два параметра, что означает, что код запуска каждой программы должен содержать анализатор командной строки.Еще в 16-битные дни люди казались, чтобы спасти каждый байт.Сказать им: «О, и все ваши программы будут на 2 кб больше», вероятно, не заставит вас много друзей.Я имею в виду, что это четыре сектора ввода-вывода на дискете!

Но, вероятно, причина, по которой точке записи Windows было дано другое имя, состоит в том, чтобы подчеркнуть, что это другая среда выполнения.Если бы он назывался Main, люди принимали бы программы C, предназначенные для консольной среды, бросали их в компилятор Windows, а затем запускали их, с катастрофическими результатами.

Надеюсь, это развеет ваши сомнения.

Это работает по-другому.В комплекте с компилятором имеется статически связанный объектный файл, содержащий фактическую точку входа.Эта точка входа выполняет инициализацию, а затем вызывает вашу точку входа (т.ВинМейн).

То, что эта статическая часть ожидает вызвать, может быть изменено.Например, в Visual Studio в настройках компоновщика есть поле для имени точки входа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top