自由图书馆阻止了我的应用程序
FreeLibrary blocks my application
大家好!
我写了一些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 中有任何可以运行析构函数的静态数据,那么问题可能就在那里。
相关文章:
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- 是否可以将不同的编译器嵌入到我的应用程序中?
- 即使在我为我的应用程序授予管理员后也无法从 Windows 系统复制目录
- 计算有多少人执行我的C++应用程序
- 为什么我的 C# 应用程序无法加载我的 C++ dll?
- 是否可以将 VBA 编程环境添加到我的C++应用程序?
- 指定在用户固定我的应用程序时用于运行应用程序的命令参数
- LOCAL_SHARED_LIBRARIES使我的应用程序崩溃
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 为什么Linux报告了我的应用程序的内存使用情况
- 如何使用Qt读取我的应用程序屏幕像素数据
- 为什么我的应用程序即使我的应用程序也关闭,即使我有cin.get();
- 需要知道 Windows API 才能在我的应用程序激活时获取回调
- 我的应用程序是从Visual Studio内部运行还是通过执行EXE文件运行
- 在我的应用程序中侦听 iexplorer 的关闭事件
- 将 python 嵌入我的应用程序时内存泄漏
- 当我释放由CFFI生成的DLL分配的char*时,为什么我的应用程序会崩溃