2012-04-17 89 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