我在写一个需要多次动态调用一个单独的DLL的DLL。我想保持被调用者加载,然后只卸载我的DLL时卸载它。但据微软称,这是一个bad idea。为什么不从调用入口函数调用FreeLibrary?
入口点函数只应 执行简单的初始化任务 ,不应调用任何其他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;
}
你怎么知道DLL尚未被卸载? – 2009-12-14 19:46:17
@Anon:我不知道。事实上,我不知道它甚至连载入。但如果它已加载并且尚未卸载,我想卸载它。 – 2009-12-14 21:03:00
听起来像你应该静态链接到其他DLL,而不是试图动态加载它。 – 2009-12-15 02:29:32