2012-04-17 38 views
2

美好的一天,每个人!FreeLibrary阻止我的申请

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

某些时候应用程序块调用FreeLibrary时,我做错了什么?

我实现的DllMain但这不是在CPP文件解决我的问题=(

在.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 (); 
} 

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则通话和应用程序冻结任何消息。

回答

1

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

+0

在我的dll中没有dllMain,析构函数被称为其他地方,但它看起来不对。我将尝试创建dllMain并确定发生了什么。 – Jeka 2012-04-18 10:11:01

+0

我执行dllMain,但这不是解决我的问题=( 查看详情 – Jeka 2012-04-24 10:17:32

+0

也许你的DLL也调用FreeLibrary,在析构函数的某处?这可能会导致死锁,因为FreeLibrary中有一个关键部分 – Pete 2012-04-25 13:44:46

3

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

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

+0

如何解决这个问题,以及如何找出螺纹堵塞?我没有创建任何线程manualy – Jeka 2012-04-24 10:25:22