gpt4 book ai didi

dll - CRT 初始化和 DLLMain

转载 作者:行者123 更新时间:2023-12-03 19:56:29 48 4
gpt4 key购买 nike

行情:

来自文档“创建 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,则
_DllMainCRTStartup(和DLLMain)你的DLL会在入口之前被调用
可执行文件的点(mainCRTStartup 或 WinMainCRTStartup),基于
[3] - _DllMainCRTStartup 调用初始化 CRT 的 _CRT_INIT,并且
mainCRTStartup 也将初始化 CRT,所以实际发生了什么
用 CRT 吗?

如果您的 DLL 将在 mainCRTStartup 之前加载,则调用 CRT 函数
在 DLLMain 或其他导出函数中是否安全?

谁来初始化 CRT DLL?

最佳答案

您正在假设 DLL 的入口点始终是 _DllMainCRTStartup .事实并非如此,这只是链接器的默认设置。它可以是程序员想要的任何东西,可以使用链接器的/ENTRYPOINT 选项快速轻松地更改。 Microsoft 无法阻止这种情况发生。不是一个很好的做法,指出这是该文件的重点。

因此,如果这样的自定义入口点也不能确保显式初始化 CRT,那么 [2] 事故很容易被调用。这不仅涉及初始化 CRT 运行时状态,还涉及初始化 DLL 的全局状态,例如调用 C 初始化程序、静态 C++ 对象的构造函数和分配线程局部变量。 CRT 的 DLL 版本不能做的事情。请记住,_DllMainCRTStartup 和 _CRT_INIT 链接到 DLL 本身,该代码不在 CRT 的 DLL 版本中。

动态 CRT 自己的运行时状态由 CRT DLL 自己的入口点初始化,Windows 加载程序确保它首先运行。

关于dll - CRT 初始化和 DLLMain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27383635/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com