2

今天是个好日子!

我写了一些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 调用和应用程序冻结后没有消息。

4

2 回答 2

4

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

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

于 2012-04-17T08:42:10.970 回答
2

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

于 2012-04-17T08:30:17.687 回答