【发布时间】:2015-02-07 14:55:46
【问题描述】:
引述:
来自 Microsoft 的文档“创建 DLL 的最佳实践”http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/DLL_bestprac.doc:
“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 的 _CRT_INIT,并且 mainCRTStartup 也将初始化 CRT,所以实际发生了什么 用 CRT 吗?
如果您的 DLL 将在 mainCRTStartup 之前加载,则调用 CRT 函数 在 DLLMain 或其他导出函数中是否安全?
谁将实际初始化 CRT DLL?
【问题讨论】: