【问题标题】:FreeLibrary blocks my applicationFreeLibrary 阻止了我的应用程序
【发布时间】:2012-04-17 08:17:06
【问题描述】:

大家好!

我写了一些 dll,在我的项目中使用。在类的构造函数中我加载库lib = LoadLibrary(L"library.dll");,在析构函数中我使用释放它 if (lib) FreeLibrary(lib);

调用 FreeLibrary 时,有时应用程序会阻塞,我做错了什么?

我实现了 dllMain 但这并不能解决我的问题 =(

在.h文件中

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved );

extern "C" {
    static projector::CProjCorrectionsClient* corrections;

    void DLLPROJECTOR_EXPORT CorrectionsInit    (const char* configFile);
    void DLLPROJECTOR_EXPORT CorrectionsApply   ();
}

在cpp文件中

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )
{
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
            qDebug() << "DLL_PROCESS_ATTACH";
            corrections = new projector::CProjCorrectionsClient();
            break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:
            break;

        case DLL_PROCESS_DETACH:
            qDebug() << "DLL_PROCESS_DEATTACH";
            delete corrections;
            qDebug() << "Corrections delete success";
            break;
    }
    qDebug() << "Out side dllmain switch";
    return TRUE; 
}

在控制台上我看到以下消息:

DLL_PROCESS_ATTACH 外部 dllmain 开关 <...> 尝试释放库 DLL_PROCESS_DEATTACH 更正删除成功 外部 dllmain 开关

FreeLibrary 调用和应用程序冻结后没有消息。

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    确保您没有在等待 DLL_PROCESS_DETACH 中的某个线程。

    当调用 DllMain 时,系统获取内部临界区,如果你的代码在 DllMain 中等待某个线程 T 完成,这可能会导致死锁,这个线程在完成时也会想做 DLL_PROCESS_DETACH,但是由于系统临界区被获取了将无限等待导致死锁。

    【讨论】:

    • 如何修复它,以及如何找出哪个线程阻塞?我没有手动创建任何线程
    【解决方案2】:

    问题应该是 - 'dll 做错了什么?'。如果由于引用计数已达到零而要卸载库,则 FreeLibrary 将为 dll 提供清理的机会,并使用 DLL_PROCESS_DETACH 调用 DllMain。也许尝试调试 dll 以查看此事件发生时发生的情况。 此外,如果 DLL 中有任何静态数据可以运行析构函数,那么问题可能就出在此处。

    【讨论】:

    • 我的 dll 中没有 dllMain,并且在其他地方调用了析构函数,但它看起来不对。我将尝试创建 dllMain 并查看发生了什么。
    • 我实现了 dllMain 但这并不能解决我的问题 =( 详情请参阅问题
    • 也许您的 dll 也在某个析构函数中调用 FreeLibrary?这可能会导致死锁,因为 FreeLibrary 中有一个关键部分
    • 也许解决方案是从您的 dll 中导出客户端必须调用的初始化和清理函数。
    • 我的lib中没有调用FreeLibrary,我有release函数,必须在freelib之前调用,所有数据从那里删除
    猜你喜欢
    • 2012-07-12
    • 2016-05-22
    • 2011-03-25
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多