DLL中的以下代码会发生什么?
#include <vector>
std::vector<int> global_vector;
BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
global_vector.push_back(1);
}
return TRUE;
}
...如果用/ MD编译?向量的构造函数调用的代码和push_back(即内存管理,异常处理......)位于MSVCRT.DLL ......据我所知,在此阶段不能保证映射。是否得到特殊待遇?
答案 0 :(得分:1)
来自here:
简而言之,当调用
DllMain
时,OS加载程序处于相当脆弱的状态。首先,它在其结构上应用了一个锁,以防止在该调用内部发生内部损坏,其次,某些依赖项可能不处于完全加载状态。 在加载二进制文件之前,OS Loader会查看其静态依赖项。如果那些需要额外的依赖关系,它也会查看它们。作为这种分析的结果,它提出了一个序列,其中需要调用这些二进制文件的DllMain
。事情非常聪明,在大多数情况下,你甚至可以不遵守MSDN中描述的大多数规则 - 但并非总是如此。