美好的一天,大家!
我写了一些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调用和应用程序冻结后没有消息。
答案 0 :(得分:4)
确保您没有等待DLL_PROCESS_DETACH中的某个线程。
当调用DllMain时,系统会查询内部关键部分,如果你的DllMain中的代码等待某个线程T完成就会导致死锁,这个线程在完成时也会想做DLL_PROCESS_DETACH,但是因为系统关键部分需要它将等待infinitelly造成僵局。
答案 1 :(得分:1)
问题应该是 - 'dd做错了什么?'。如果要卸载库因为其引用计数已达到零,则FreeLibrary将为dll提供清理的机会,并将使用DLL_PROCESS_DETACH调用DllMain。也许尝试调试dll以查看此事件发生时的最新情况。 此外,如果DLL中有任何静态数据可以运行析构函数,那么问题就在那里。