C++中WinMain、main和DllMain的区别

29

这三个函数有什么区别,何时使用它们?


https://reverseengineering.stackexchange.com/questions/2079/difference-between-dllmain-and-dllentrypoint - Gabriel
3个回答

26

main() 意味着你的程序是一个控制台应用程序

WinMain() 意味着你的程序是一个GUI应用程序,也就是说,它显示窗口和对话框而不是控制台。

DllMain() 意味着你的程序是一个DLL。DLL 不能被直接执行,但可以被上述两种类型的应用程序使用。

因此:

  • 当你编写一个将会显示窗口等内容的程序时,请使用WinMain。
  • 当你编写一个 DLL 时,请使用DLLMain。
  • 在其他情况下,请使用 main。

如果您使用rundll32.exe,DLL可以直接运行。 - shoosh
19
@Shy: 使用rundll32.exe运行DLL是间接运行DLL的一种方式。 ;) - dalle
9
WinMain的意思是应用程序不会分配控制台窗口,其标准输入和输出也无处可去。所有Windows API的核心功能(例如事件循环、类注册、窗口创建等)仍然需要手动完成。此外,使用main()的程序也可以拥有窗口。 - user3458
2
这是一位Windows开发者在同一主题上的帖子 http://blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx - user3458
9
“main() means your program is a console application.”这句话是不正确的。我的GUI系统程序总是使用标准的main()函数,没有使用非标准的启动函数的技术原因。 - Cheers and hth. - Alf

12

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
这是一个很好的解释,但它还需要指定这些是三种不同类型的“可执行文件”(控制台应用程序、Windows 应用程序、Windows DLL)所需的入口点。 - Jon Trauntvein
3
“WinMain(或其他版本的main)也是一个必需的函数”是错误的。这不是Windows特有的,而是Microsoft语言扩展的一部分。而且即使在使用Microsoft的工具时也不是必需的。它也不是由操作系统调用,而是由进程的入口点函数调用。 - Cheers and hth. - Alf

0

[你问题的补充说明]

还要记得DllEntryPoint:

  • 当涉及到加载时间时,入口点是DllMain。
    (例如:COM进程服务器DLL)

  • 当涉及到运行时间时,入口点是DllEntryPoint。
    (例如:LoadLibrary被调用)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接