【发布时间】:2010-12-26 13:22:29
【问题描述】:
我正在编写一个需要多次动态调用单独的 DLL 的 DLL。我想保持被调用者加载,然后在卸载我的 DLL 时将其卸载。但根据微软的说法,那是bad idea。
入口点函数应该只 执行简单的初始化任务 并且不应调用任何其他 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还没有被卸载?
-
@Anon:我不知道。事实上,我什至不知道它曾经被加载过。但如果它已加载但尚未卸载,我想卸载它。
-
听起来您应该静态链接到另一个 DLL,而不是尝试动态加载它。
-
@Remy,如果可以的话,我会的。 DLL 的路径在编译时不可用。
-
也许压力在于“您不应该在进程终止时调用 FreeLibrary 函数。”也就是说,当进程终止时不做任何事情,也许目标是尽快退出以节省计算资源。
标签: c++ windows dll winapi entry-point