回覆列表
  • 1 # 使用者4206320794714

    因為DllMain在這些場合會被重新呼叫(例外是LOAD_LIBRARY_AS_DATAFILE和DisableThreadLibraryCalls這樣跳過DllMain的場合)。為了避免造成死迴圈問題,作業系統給呼叫DllMain的程式碼加鎖以確保DllMain會不被幹涉地執行完畢而不會重入你自己這個DllMain。另外作業系統也在獲取載入的DLL列表的時候加鎖(比如LoadLibrary、FreeLibrary或者建立執行緒都會列舉當前程序的所有DLL來呼叫這些DLL的DllMain)來等待你的DllMain結束以避免獲得不完整的DLL列表。但是這需要程式設計師的合作,不在DllMain中編寫可能造成重新獲取DLL載入鎖的程式碼。程式卡死不算什麼嚴重後果,而且也很容易重現(載入其他的DLL,建立執行緒等等,在全域性堆上分配記憶體都可能造成這個問題,如果記憶體分配器的執行緒同步鎖沒寫好的話)。如果你在這裡建立一個全域性的鉤子,這甚至會造成系統卡死。這個問題無法除錯,因為偵錯程式需要在被除錯的程序建立一個遠端執行緒之後才能中斷。最好的辦法是不要在DllMain中放那些程式碼。

  • 中秋節和大豐收的關聯?
  • 信用卡的備用金是什麼意思?