我正在写需要动态调用一个单独的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则是更糟糕,因为它只会的有时的僵局,如果碰巧你的自由递减引用计数为零,该库实际上是释放。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top