其中称为第一,DllMain()还是全局静态对象构造函数? [英] Which is called first, DllMain() or global static object constructor?

查看:292
本文介绍了其中称为第一,DllMain()还是全局静态对象构造函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



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



是否可能表示DllMain()中初始化过程的成功或失败?



谢谢。

解决方案

MSDN的 DllMain 文档说:


如果您的DLL与C
运行时库(CRT)链接,则CRT提供的
点将调用

全局和静态C ++对象的构造函数和析构函数。
因此,
DllMain的这些限制也适用于构造函数和
析构函数,以及任何从它们调用
的代码。


因为DllMain中的代码可能使用静态对象,所以静态对象必须在DllMain运行于DLL_PROCESS_ATTACH之前构建,并在DLL_PROCESS_DETACH运行后被销毁。



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



EXE:

  int _tmain(int argc,_TCHAR * argv [])
{
wprintf(LMain,loading library\\\
);
HMODULE h = LoadLibrary(LTest.dll);

if(h)
{
wprintf(LMain,freeing library\\\
);
FreeLibrary(h);
}

wprintf(LMain,exiting\\\
);
return 0;
}

DLL:

  struct Moo 
{
Moo(){wprintf(LMoo,constructor\\\
); }
〜Moo(){wprintf(LMoo,destructor\\\
); }
};

Moo m;

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
wprintf(LDllMain,DLL_PROCESS_ATTACH\\\
);
break;
case DLL_THREAD_ATTACH:
wprintf(LDllMain,DLL_THREAD_ATTACH\\\
);
break;
case DLL_THREAD_DETACH:
wprintf(LDllMain,DLL_THREAD_DETACH\\\
);
break;
case DLL_PROCESS_DETACH:
wprintf(LDllMain,DLL_PROCESS_DETACH\\\
);
break;
默认值:
wprintf(LDllMain,???? \\\
);
break;
}
return TRUE;
}

这些将一起打印:

  Main,加载库
Moo,构造函数
DllMain,DLL_PROCESS_ATTACH
主库,释放库
DllMain,DLL_PROCESS_DETACH
Moo,destructor
Main,exiting

正如你所看到的, DllMain(...,DLL_PROCESS_DETACH,...) DllMain(...,DLL_PROCESS_ATTACH,...) $ c>


I am writing a DLL which defines a global static object.

In the object's constructor I am doing some initialization that may or may not succeed.

Is it possible to signal success or failure of the initialization process in DllMain() ? Which of the two is called first ?

Thank you.

解决方案

MSDN's DllMain documentation says:

If your DLL is linked with the C run-time library (CRT), the entry point provided by the CRT calls the constructors and destructors for global and static C++ objects. Therefore, these restrictions for DllMain also apply to constructors and destructors and any code that is called from them.

Since the code within DllMain may use the static objects, the static objects must be constructed before DllMain is run for DLL_PROCESS_ATTACH, and destroyed after it is run for DLL_PROCESS_DETACH.

You can verify this with a simple test exe and test dll.

EXE:

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;
}

Together those will print:

Main, loading library
Moo, constructor
DllMain, DLL_PROCESS_ATTACH
Main, freeing library
DllMain, DLL_PROCESS_DETACH
Moo, destructor
Main, exiting

As you can see, the static object is constructed before DllMain(...,DLL_PROCESS_ATTACH,...) and destroyed after DllMain(...,DLL_PROCESS_DETACH,...)

这篇关于其中称为第一,DllMain()还是全局静态对象构造函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆