行情:
从文档"创建DLL的最佳实践" http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/DLL_bestprac.doc的Microsoft:
"DLL通常具有复杂的相互依赖性,隐式定义它们必须加载的顺序.库加载器有效地分析这些依赖关系,计算正确的加载顺序,并按顺序加载DLL." [1]
"(在DLLMain中)使用动态C运行时(CRT)中的内存管理功能.如果未初始化CRT DLL,调用这些函数可能会导致进程崩溃." [2]
来自MSDN:http://msdn.microsoft.com/en-us/library/988ye33t.aspx
"_DllMainCRTStartup函数执行多项操作,包括调用_CRT_INIT,它初始化C/C++运行时库并在静态非局部变量上调用C++构造函数.如果没有此函数,运行时库将保持未初始化状态".[3]
"除了初始化C运行时库之外,_DllMainCRTStartup还调用了一个名为DllMain的函数." [4]
问题:
如果您的DLL依赖于CRT DLL,基于[1],将首先加载CRT DLL(首先进行初始化),那么[2]如何发生?
基于[3]和[4],_DllMainCRTStartup将调用_CRT_INIT来初始化CRT,那么[2]会如何发生?
如果一个可执行文件通过"隐式链接"加载你的DLL,你的DLL的_DllMainCRTStartup(和DLLMain)将在可执行文件的入口点(mainCRTStartup或WinMainCRTStartup)之前被调用,基于 [3] - _DllMainCRTStartup调用_CRT_INIT初始化CRT和mainCRTStartup也将初始化CRT,那么CRT究竟发生了什么?
如果你的DLL将在mainCRTStartup之前加载,那么在DLLMain或其他导出函数中调用CRT函数是否安全?
谁会实际初始化CRT DLL?
它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创建依赖循环.这可能导致在系统执行其初始化代码之前使用DLL.
我试图LoadLibrary从DllMain 打来电话,什么也没发生.
我看到的唯一问题是加载的DLL将在我的DllMain执行的其余部分之前使用我的DLL中的函数.
为什么我不能在DllMain中调用LoadLibrary?
好吧,我意识到我不能在DllMain中调用LoadLibrary只是因为我必须像其他信徒一样相信 MSDN(我在那里看到了一些错误的东西,但我也应该忘记它们).
并且因为在较新版本的Windows中可能会发生某些事情(尽管过去十年没有任何变化).
但是,任何人都可以显示一个代码,它会重现在LoadLibraryDllMain中调用时发生的事情吗?在任何现有的Windows操作系统?
不只是在另一个内部调用一个单例初始化函数,而是LoadLibrary在DllMain中?