Разница между WinMain, main и DllMain в С++

В чем разница между тремя функциями и когда их использовать??


person Ahmed Said    schedule 06.01.2009    source источник


Ответы (3)


WinMain используется для приложения (окончание .exe), чтобы указать, что процесс запускается. Он предоставляет аргументы командной строки для процесса и служит точкой входа пользовательского кода для процесса. WinMain (или другая версия main) также является обязательной функцией. ОС нужна функция для вызова, чтобы запустить запущенный процесс.

DllMain используется для DLL, чтобы обозначить множество различных сценариев. В частности, он будет вызываться, когда

  1. DLL загружается в процесс: DLL_PROCESS_ATTACH
  2. DLL выгружается из процесса: DLL_PROCESS_DETACH
  3. В процессе запускается поток: DLL_THREAD_ATTACH
  4. Поток завершен в процессе: DLL_THREAD_DETACH

DllMain — необязательная конструкция, с которой связано множество неявных контрактов. Например, вы не должны вызывать код, который заставит загрузить другую DLL. В общем, это довольно сложная функция, и ее следует избегать, если у вас нет особой потребности в ней.

person JaredPar    schedule 06.01.2009
comment
Это хорошее объяснение, но необходимо также указать, что это обязательные точки входа для трех разных типов исполняемых файлов (консольное приложение, приложение Windows, Windows DLL). - person Jon Trauntvein; 06.01.2009
comment
-1 WinMain (или другая версия main) тоже нужная функция неверна. Дело не в Windows, а в расширении языка Microsoft. И это даже не требуется с инструментами Microsoft. И это не вызывается ОС. Он вызывается функцией точки входа процесса. - person Cheers and hth. - Alf; 14.12.2012

main() означает, что ваша программа является консольным приложением.

WinMain() означает, что программа представляет собой приложение с графическим интерфейсом пользователя, т. е. , он отображает окна и диалоговые окна вместо отображения консоли.

DllMain() означает, что программа является DLL. Библиотека DLL не может быть запущена напрямую, но используется двумя вышеупомянутыми типами приложений.

Следовательно:

  • Используйте WinMain, когда вы пишете программу, которая будет отображать окна и т. д.
  • Используйте DLLMain при написании DLL.
  • Используйте main во всех остальных случаях.
person Frederick The Fool    schedule 06.01.2009
comment
DLL может работать напрямую, если вы используете rundll32.exe - person shoosh; 06.01.2009
comment
@Shy: Использование rundll32.exe для запуска DLL означает косвенный запуск DLL. ;) - person dalle; 06.01.2009
comment
WinMain просто означает, что для приложения НЕ будет выделено окно консоли, а его стандартный ввод и стандартный вывод никуда не денутся. Все внутренности Windows API (такие как цикл событий, регистрация классов, создание окон) по-прежнему нужно делать вручную. Кроме того, программы, использующие main(), также могут иметь окна. - person ; 06.01.2009
comment
Вот сообщение от разработчика Windows на ту же тему блогов. msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx - person ; 09.01.2009
comment
-1 main() означает, что ваша программа является консольным приложением. это неверно. мои программы подсистемы GUI всегда используют стандартный main. нет технических причин для использования нестандартных функций запуска. - person Cheers and hth. - Alf; 14.12.2012

[Дополнение к вашему вопросу]

Также не забудьте DllEntryPoint:

  • Когда речь идет о времени загрузки, точкой входа является DllMain.
    (например, внутрипроцессная серверная DLL COM).

  • Когда задействовано время выполнения, точкой входа является DllEntryPoint.
    (Например, вызывается LoadLibrary).

person Z80    schedule 05.07.2018