工作中遇到調用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放在必現的場景下測試,不再出現加載失敗的問題。
大致算解決這個問題了,后續再追蹤看看有沒有徹底解決。