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

在对象的构造函数中,我正在执行一些可能成功或可能不成功的初始化。

是否有可能在DllMain()中发出初始化过程成功或失败的信号?两者中的哪个首先被称为?

谢谢。

最佳答案

MSDN的DllMain文档说:


如果您的DLL与C链接
运行时库(CRT),该条目
CRT提供的点称为
的构造函数和析构函数
全局和静态C ++对象。
因此,这些限制
DllMain也适用于构造函数和
析构函数以及
从他们那里呼唤。


由于DllMain中的代码可能使用静态对象,因此必须在为DLL_PROCESS_ATTACH运行DllMain之前构造静态对象,并在为DLL_PROCESS_DETACH运行DllMain之后将其销毁。

您可以使用简单的测试exe和测试dll进行验证。

可执行程序:

int _tmain(int argc, _TCHAR* argv[])
{
    wprintf(L"Main, loading library\n");
    HMODULE h = LoadLibrary(L"Test.dll");

    if (h)
    {
        wprintf(L"Main, freeing library\n");
        FreeLibrary(h);
    }

    wprintf(L"Main, exiting\n");
    return 0;
}


DLL:

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


如您所见,静态对象在DllMain(...,DLL_PROCESS_ATTACH,...)之前构造,在DllMain(...,DLL_PROCESS_DETACH,...)之后销毁

关于dll - 首先是DllMain()还是全局静态对象构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4496233/

10-09 07:22