LoadLibrary 失敗的解決


工作中遇到調用Loadlibrary 偶發失敗的問題,不是必現,而且這種錯誤只是在程序初始化的時候出現,初始化成功后當然不會調用,而初始化也不是經常做的動作,所以查找原因起來比較麻煩,調試過程中發現有兩個方法把這個問題變成必現的問題,一個是加調試代碼反復加載dll。

h=LoadLibrary(“A.dll”);

FreeLibrary(h);

h=LoadLibrary(“A.dll”);

FreeLibrary(h);

 

第二次loadlibrary就會失敗!!!

 

還有個方法是程序運行時按急停開關,之后關閉程序后重新打開並初始化,這個時候很大可能會失敗。

 

通過查資料,發現loadlibrary失敗有幾個原因:

1.文件路徑不對

2.dll里有全局變量出事化失敗或dllmain函數返回false。

我們這個程序里用的是絕對路徑,原因1是不成立的。分析dll的代碼,發現原因2也是不成立的。

追蹤到這里就沒思路解決問題了,后來發現加載dll可以用loadlibrary,loadlibraryex,afxloadlibrary。試了下其他兩個函數,loadlibraryex現象一樣,afxloadlibrary會拋異常。查了資料,afxloadlibrary是用來加載mfc擴展dll的,不同的一點是 在加載dll前會處理線程同步。好像初始化也沒有線程同步的問題啊。不理解。

再仔細看代碼,發現dllmain所在的類文件里有 #include <afxdllx.h> , 不理解這個頭文件有什么作用,屏蔽后編譯沒影響,將dll放在必現的場景下測試,不再出現加載失敗的問題。

大致算解決這個問題了,后續再追蹤看看有沒有徹底解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM