- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个定义全局静态对象的 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/
我正在学习 DLL,我在 MSDN 中看到了以下段落: If you are providing your own entry-point, see the DllMain function. The
我正在写这样一个 dllmain: #include "main.h" #include "init.h" #include BOOL WINAPI DllMain(HINSTANCE hinstD
行情: 来自文档“创建 DLL 的最佳实践”http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565
似乎当在 DLL_PROCESS_ATTACH 上从 DllMain 中创建线程时,只有在加载所有 dll 后,该线程才会开始。由于我需要确保线程在继续之前运行,因此出现了死锁。有没有办法强制线程启动
我正在编写一个定义全局静态对象的 DLL。 在对象的构造函数中,我正在执行一些可能成功也可能不成功的初始化。 是否可以在 DllMain() 中发出初始化过程成功或失败的信号?这两个中哪一个先被调用?
我正在为某个系统编写一个插件,但是有一些行为不端的应用程序在 dll 初始化期间调用了我的插件(来自 DllMain 或 InitInstance,它是 DllMain 的包装器)。 我想知道是否有办
这个问题在这里已经有了答案: Creating a thread in DllMain? (4 个答案) 关闭 7 年前。 这可能是显而易见的事情,但对我来说意义不大。我正在尝试创建一个 dll,它
我正在编写一个非托管 dll(使用 C++ 和 WinAPI),但我想使用一些 C# 方法,因此,我使用 C++/CLI 创建了一个包装器。 但问题是:非托管 dll 将被“注入(inject)”(L
我有一个 C++ 程序,它有一个 DLLMain 函数,当这个程序(实际上是一个 DLL)被另一个程序加载时,该函数运行一些代码。这工作正常。 现在,当我这次编译同一个 C++ 程序时,包括一个已经定
我正在尝试创建 DLL 文件,但在 DLLMAIN() 中运行函数时遇到问题。 我想做这样的事情: #include "stdafx.h" #include #include INT APIENT
我尝试在 Borland c++ 5.02 中创建 *.dll 文件,我对这个函数有疑问 BOOL APIENTRY DllMain( HANDLE hModule,
我有一个 Dllmain,它在线程附加到此 DLL 时分配线程本地存储。代码如下: BOOL APIENTRY DllMain(HMODULE hModule,
知名度之一DLLMain函数参数是 LPVOID lpvReserved。来自 MSDN 文档: If fdwReason is DLL_PROCESS_ATTACH, lpvReserved is
我想编写 DLL,但我想测试我正在编写的内容。 我尝试用 F5 调试它,但我收到一个错误: 我读了文章Walkthrough: Creating and Using a Dynamic Link Li
哪些函数在 DllMain() 之前被调用?如果在 C 运行时初始化期间不止一个,那么顺序很重要。 最佳答案 来自source :- If your DLL is linked with the C
在 *nix .so 库中,是否存在在加载和卸载库时由系统调用的入口点? 更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/析构概念的
我在多个来源中了解到,CreateProcess 不得从 DllMain 函数中调用。 CreateProcess : 不要从 DllMain 函数调用 CreateProcess。这会导致应用程序停
我在多个来源中了解到,CreateProcess 不得从 DllMain 函数中调用。 CreateProcess : 不要从 DllMain 函数调用 CreateProcess。这会导致应用程序停
当设置了线程特定的 Hook 时,DLL 中的原因代码是什么? 谁能帮我解决这个问题吗? 谢谢,阿什什。 最佳答案 您的问题仍然不清楚,但我假设您的意思是使用 SetWindowsHookEx() 安
我想创建一个 dll,在某些情况下自行卸载,这意味着 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID
我是一名优秀的程序员,十分优秀!