Разница между WinMain, main и DllMain в C ++ - PullRequest
18 голосов
/ 06 января 2009

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

Ответы [ 3 ]

21 голосов
/ 06 января 2009

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

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

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

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

  • Используйте WinMain, когда вы пишете программу, которая будет отображать окна и т. Д.
  • Используйте DLLMain при написании DLL.
  • Используйте main во всех остальных случаях.
8 голосов
/ 06 января 2009

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 загружаться. В общем, это довольно сложная функция, чтобы получить права, и ее следует избегать, если у вас нет особой необходимости в этом

0 голосов
/ 05 июля 2018

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

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

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

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

...