首先调用哪个,DllMain()还是全局静态对象构造函数?

首先调用哪个,DllMain()还是全局静态对象构造函数?,dll,object,static,constructor,global-variables,Dll,Object,Static,Constructor,Global Variables,我正在编写一个DLL,它定义了一个全局静态对象 在对象的构造函数中,我正在进行一些初始化,这些初始化可能会成功,也可能不会成功 是否可以在DllMain()中发出初始化过程成功或失败的信号?这两个中哪一个被称为第一个 谢谢。MSDN的文档说明: 如果您的DLL与C 运行时库(CRT),条目 CRT提供的点调用 的构造函数和析构函数 全局和静态C++对象。 因此,这些限制 DllMain也适用于施工人员和 析构函数和任何 他们打电话来 由于DllMain中的代码可能使用静态对象,因此必须在运行Dl

我正在编写一个DLL,它定义了一个全局静态对象

在对象的构造函数中,我正在进行一些初始化,这些初始化可能会成功,也可能不会成功

是否可以在DllMain()中发出初始化过程成功或失败的信号?这两个中哪一个被称为第一个

谢谢。

MSDN的文档说明:

如果您的DLL与C 运行时库(CRT),条目 CRT提供的点调用 的构造函数和析构函数 全局和静态C++对象。 因此,这些限制 DllMain也适用于施工人员和 析构函数和任何 他们打电话来

由于DllMain中的代码可能使用静态对象,因此必须在运行DllMain以进行DLL\u进程\u附加之前构造静态对象,并在运行DllMain以进行DLL\u进程\u分离之后销毁静态对象

您可以使用简单的测试exe和测试dll来验证这一点

EXE:

动态链接库:

这些文件将一起打印:

Main, loading library
Moo, constructor
DllMain, DLL_PROCESS_ATTACH
Main, freeing library
DllMain, DLL_PROCESS_DETACH
Moo, destructor
Main, exiting
正如您所看到的,静态对象是在
DllMain(…,DLL\u PROCESS\u ATTACH,…)
之前构造的,在
DllMain(…,DLL\u PROCESS\u DETACH,…)之后销毁的。

struct Moo
{
    Moo() { wprintf(L"Moo, constructor\n"); }
    ~Moo() { wprintf(L"Moo, destructor\n"); }
};

Moo m;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        wprintf(L"DllMain, DLL_PROCESS_ATTACH\n");
        break;
    case DLL_THREAD_ATTACH:
        wprintf(L"DllMain, DLL_THREAD_ATTACH\n");
        break;
    case DLL_THREAD_DETACH:
        wprintf(L"DllMain, DLL_THREAD_DETACH\n");
        break;
    case DLL_PROCESS_DETACH:
        wprintf(L"DllMain, DLL_PROCESS_DETACH\n");
        break;
    default:
        wprintf(L"DllMain, ????\n");
        break;
    }
    return TRUE;
}
Main, loading library
Moo, constructor
DllMain, DLL_PROCESS_ATTACH
Main, freeing library
DllMain, DLL_PROCESS_DETACH
Moo, destructor
Main, exiting