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】:

ma​​in() 表示您的程序是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的区别的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 WINMAIN 和 main()(扩展)

关于VC++的Winmain函数(WINAPI是啥?)

c++主函数如何调用"WinMain"函数

关于VC++的Winmain函数(WINAPI是啥?)

从WinMain开始

(菜鸟)了解一下MFC程序如何进入WinMain的