gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:28:46 25 4
gpt4 key购买 nike

我正在编写一个定义全局静态对象的 DLL。

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

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

谢谢。

最佳答案

MSDN 的 DllMain文档说:

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.

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

您可以使用简单的测试 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;
}

动态链接库:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com