C++中WinMain、main和DllMain的区别
Posted
技术标签:
【中文标题】C++中WinMain、main和DllMain的区别【英文标题】:Difference between WinMain,main and DllMain in C++ 【发布时间】:2010-09-29 19:49:37 【问题描述】:这三个功能有什么区别,什么时候使用??
【问题讨论】:
reverseengineering.stackexchange.com/questions/2079/… 【参考方案1】:main() 表示您的程序是console application。
WinMain() 表示程序是GUI application——也就是说,它显示窗口和对话框,而不是显示控制台。
DllMain() 表示程序是DLL。 DLL 不能直接运行,但供上述两种应用程序使用。
因此:
在编写要显示窗口等的程序时使用 WinMain。 在编写 DLL 时使用 DLLMain。 在所有其他情况下使用 main。【讨论】:
使用rundll32.exe可以直接运行DLL @Shy:使用rundll32.exe运行DLL就是间接运行DLL。 ;) WinMain 只是意味着不会为应用程序分配控制台窗口,并且它的标准输入和标准输出无处可去。 Windows API 的所有内容(例如事件循环、类注册、窗口创建)仍然需要手动完成。此外,使用 main() 的程序也可以有窗口。 这是来自 Windows 开发人员关于同一主题的帖子 blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx -1 "main() 表示您的程序是控制台应用程序。"是不正确的。我的 GUI 子系统程序总是使用标准的main
。使用非标准启动功能没有技术原因。【参考方案2】:
WinMain 用于应用程序(以 .exe 结尾)来指示进程正在启动。它将为进程提供命令行参数,并作为进程的用户代码入口点。 WinMain(或不同版本的 main)也是必需的函数。操作系统需要调用一个函数来启动一个正在运行的进程。
DllMain 用于 DLL 以表示许多不同的场景。最值得注意的是,当
-
DLL 被加载到进程中:DLL_PROCESS_ATTACH
DLL 已从进程中卸载:DLL_PROCESS_DETACH
进程中启动了一个线程:DLL_THREAD_ATTACH
线程在进程中结束:DLL_THREAD_DETACH
DllMain 是一个可选构造,并且有很多与之相关的隐式契约。例如,您不应该调用会强制加载另一个 DLL 的代码。一般来说,要正确使用它是相当困难的功能,除非您有非常特殊的需要,否则应该避免使用它。
【讨论】:
这是一个很好的解释,但它还需要指定这些是三种不同类型的“可执行文件”(控制台应用程序、Windows 应用程序、Windows DLL)的必需入口点。 -1 “WinMain(或不同版本的 main)也是必需的函数”是错误的。这不是 Windows 的东西,而是 Microsoft 语言扩展的东西。微软的工具甚至不需要它。而且,它不是由操作系统调用的。它由进程的入口点函数调用。【参考方案3】:[您的问题的附录]
也不要忘记 DllEntryPoint:
当涉及加载时间时,入口点是 DllMain。 (例如 COM 进程内服务器 DLL)。
当涉及运行时间时,入口点是 DllEntryPoint。 (例如 LoadLibrary 被调用)。
【讨论】:
以上是关于C++中WinMain、main和DllMain的区别的主要内容,如果未能解决你的问题,请参考以下文章