FreeLibrary会阻止我的应用程序

时间:2012-04-17 08:17:07

标签: c++ dll

美好的一天,大家!

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

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

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

<。>文件中的

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开关 &LT; ...&GT; 尝试发布库 DLL_PROCESS_DEATTACH 更正删除成功 外侧dllmain开关

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

2 个答案:

答案 0 :(得分:4)

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

当调用DllMain时,系统会查询内部关键部分,如果你的DllMain中的代码等待某个线程T完成就会导致死锁,这个线程在完成时也会想做DLL_PROCESS_DETACH,但是因为系统关键部分需要它将等待infinitelly造成僵局。

答案 1 :(得分:1)

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