在DllMain()之前调用哪些函数?

4

DllMain()之前调用哪些函数?如果在C运行时初始化期间调用多个函数,则顺序很重要。


至少会调用一个 main() - alk
你的问题完全取决于你使用的运行时库。微软公开了几个启动函数,最终会调用DllMain()(如果有的话,如果没有则提供默认值)。其他C/C++运行时可能会提供其他启动例程来调用你的程序。当编写Windows代码时,你当然可以不使用C/C++运行时,完全依赖WIN32 API,在这种情况下,Windows将直接调用你的入口点。祝你好运。 - WhozCraig
3个回答

5
文献中得知:
如果您的动态链接库(DLL)与C运行时库(CRT)链接,则CRT提供的入口点将调用全局和静态C ++对象的构造函数和析构函数。因此,这些限制也适用于构造函数、析构函数以及从它们调用的任何代码。

这意味着DLL中全局/静态对象的构造函数不能调用任何依赖于除Kernel32和MSVCRxx之外的其他DLL的函数。 - Medinoc

3
我认为只有_DllMainCRTStartup()被调用,它会调用所有全局C++对象的构造函数(在C的情况下没有任何构造函数),并且(我不确定最后一个)调用DllMain()。
当然,它还调用一些Kernel32函数来初始化CRT(首先,它需要分配一些内存和TLS插槽)。

3

这非常依赖编译器。

DllMain()的调用约定与DLL的入口点完全相同,因此对于某些编译器,DllMain()就是DLL的入口点!

其他编译器使用自己的入口点,在进入DllMain()之前进行一些DLL初始化。

与此相反,EXE文件的入口点没有任何参数,函数不能返回。因此,WinMain()或main()函数不能是EXE文件的入口点,但必须有一些准备代码在调用WinMain()或main()之前被调用。


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