自由图书馆阻止了我的应用程序

FreeLibrary blocks my application

本文关键字:我的 应用程序 图书馆 自由      更新时间:2023-10-16

大家好!

我写了一些dll,在我的项目中使用。在类 I 的构造器中加载库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外侧 dll主开关<...>尝试释放库DLL_PROCESS_DEATTACH更正删除成功外侧 dll主开关

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

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

当调用 DllMain 时,系统会获取内部关键部分,如果 DllMain 中的代码等待某个线程 T 完成,这可能会导致死锁,这个线程在完成时也会想要执行DLL_PROCESS_DETACH,但由于获取了系统关键部分,它将无限等待导致死锁。

问题也许应该是 - "dll 做错了什么? 如果库要卸载,因为它的引用计数已达到零,那么 FreeLibrary 将给 dll 一个清理的机会,并将调用 DllMain 与DLL_PROCESS_DETACH。 也许尝试调试 dll 以查看发生此事件时会发生什么。此外,如果 DLL 中有任何可以运行析构函数的静态数据,那么问题可能就在那里。