为什么不从入口点函数调用FreeLibrary?
-
19-09-2019 - |
题
我正在写需要动态调用一个单独的DLL多次的DLL。我想保持被叫加载,然后就卸载它时,我的DLL被卸载。但根据微软的说法,这是一个坏主意。
在入口点函数只应 执行简单的初始化任务 而不应调用任何其他DLL 装载或终止功能。对于 例如,在入口点函数, 你不应该直接或间接地 调用LoadLibrary函数或 LoadLibraryEx功能。另外, 你不应该调用FreeLibrary则 功能时,该方法是 终止。
下面是有问题的代码。有人可以解释为什么我不应该从我的DLL入口点调用LoadLibrary和FreeLibrary则?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH :
if (hLogLib != NULL) FreeLibrary(hLogLib);
break;
}
return TRUE;
}
解决方案
我想我已经找到答案
在入口点函数应 只进行简单的初始化或 终止任务。它不能调用 在调用LoadLibrary或LoadLibraryEx 函数(或调用一个函数 这些功能),因为这可能 在DLL中创建循环依赖 加载顺序。这可能会导致一个DLL 所使用的系统具有前 执行的初始化代码。 同样,入口点函数 不能调用FreeLibrary函数 (或调用FreeLibrary则函数) 进程终止时,因为 这可能导致一个DLL正在使用 之后,该系统已执行其 终止代码。
其他提示
您不能从您的入口点调用LoadLibrary因为DllMain函数的OS加载程序锁和重新获取该加载程序锁(例如,通过调用LoadLibrary)任何企图内部运行将导致死锁。
不要做的后果的的DLLMain的内部的东西。认真。调用FreeLibrary则是更糟糕,因为它只会的有时的僵局,如果碰巧你的自由递减引用计数为零,该库实际上是释放。
不隶属于 StackOverflow