代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

为什么不从入口点调用FreeLibrary函数?

  •  4
  • John M Gant aman_novice  · 技术社区  · 15 年前

    我正在编写一个需要多次动态调用单独DLL的DLL。我想保持被调用方加载,然后在卸载DLL时卸载它。但据微软称,这是一个错误 bad idea

    入口点函数只应 执行简单的初始化任务 不应调用任何其他DLL 加载或终止功能。对于 例如,在入口点函数中, 你不应该直接或间接地 调用LoadLibrary函数或 LoadLibraryEx函数。另外,, 你不应该给免费图书馆打电话 当进程被激活时 终止。

    这是违规代码。有人能解释为什么我不应该从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;
    }
    
    3 回复  |  直到 12 年前
        1
  •  4
  •   John M Gant aman_novice    15 年前

    我想我找到了 the answer .

    入口点函数应该 仅执行简单的初始化或 LoadLibrary或LoadLibraryEx 函数(或调用 这些函数),因为这可能 在DLL中创建依赖项循环 在系统启动之前使用 执行其初始化代码。 类似地,入口点函数 不能调用FreeLibrary函数 (或调用FreeLibrary的函数) 这可能导致使用DLL 在系统执行其 终止代码。

        2
  •  2
  •   Zach    15 年前

    无法从入口点调用LoadLibrary,因为DllMain函数在OS加载程序锁内运行,任何试图重新获取该加载程序锁的尝试(例如,通过调用LoadLibrary)都将导致死锁。

        3
  •  2
  •   Ana Betts    15 年前

    死锁,如果您的free将refcount递减为零,并且库实际上已被释放。