3

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 中......据我所知,在这个阶段不能保证被映射。是否得到特殊处理?

4

1 回答 1

1

这里

简而言之,当DllMain被调用时,OS loader 处于相当脆弱的状态。首先,它在其结构上应用了锁,以防止在该调用内部发生内部损坏,其次,您的某些依赖项可能未处于完全加载状态。在加载二进制文件之前,OS Loader 会查看其静态依赖项。如果这些需要额外的依赖项,它也会查看它们。作为该分析的结果,它提出了一个序列,其中DllMain需要调用这些二进制文件中的 s 个。它非常聪明,在大多数情况下,您甚至可以不遵守 MSDN 中描述的大多数规则而侥幸逃脱 - 但并非总是如此。

于 2012-11-26T02:30:10.310 回答