WinMain,main和Cll中的DllMain之间的区别

Ahm*_*aid 20 c++ windows winmain entry-point

这三个函数之间有什么区别以及何时使用它们?

Fre*_*ool 21

main()表示您的程序是控制台应用程序.

WinMain()表示程序是一个GUI应用程序 - 也就是说,它显示窗口和对话框而不是显示控制台.

DllMain()表示程序是DLL.DLL不能直接运行,但由上述两种应用程序使用.

因此:

  • 在编写要显示窗口等的程序时使用WinMain.
  • 编写DLL时使用DLLMain.
  • 在所有其他情况下使用main.

  • @Shy:使用rundll32.exe运行DLL是间接运行DLL.;) (14认同)
  • WinMain只是意味着没有为应用程序分配控制台窗口,它的stdin和stdout无处可去.Windows API的所有内容(例如事件循环,类的注册,窗口创建)仍然需要手动完成.此外,使用main()的程序也可以有窗口. (8认同)
  • -1"main()表示您的程序是控制台应用程序." 是不正确的.我的GUI子系统程序总是使用标准的`main`.使用非标准启动功能没有技术原因. (7认同)
  • 以下是来自Windows开发人员的相同主题的帖子http://blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx (2认同)

Jar*_*Par 9

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的代码.一般来说,正确的功能是相当困难的,应该避免,除非你有一个非常具体的需要.

  • -1"WinMain(或不同版本的main)也是必需的功能"是错误的.它不是Windows的东西,它是Microsoft语言扩展的东西.而且微软的工具甚至都不需要它.并且,操作系统不会调用它.它由进程的入口点函数调用. (3认同)