【1】LoadLibrary加載動態庫失敗的可能原因以及解決方案:
(1)dll動態庫文件路徑不對。此場景細分為以下幾種情況:
1.1 文件路徑的確錯誤。比如:本來欲加載的是A文件夾下的動態庫a.dll,但是經過仔細排查原因,發現a.dll動態庫竟然被拷貝到B文件夾下去了。
若真遇到這種低級錯誤,建議你找個沒人的牆角蹲下用小拇指逆時針划圈圈去吧。。。
1.2 實參傳值錯誤。比如:實參類型為LPCWTR,經常都會因為字符串轉換導致實參事與願違。
網上的經驗總結實例。某程序員經過一番周折后通過以下語句調用成功
hDll = LoadLibrary(TEXT("user32.dll"));
再經過一番百度google后發現,原來是字符格式惹的禍。
這里的LoadLibrary實際使用了LoadLibraryW而非LoadLibraryA,因此需要UNICODE字符串(寬字符串),而非窄字符串。 如下:
#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif // !UNICODE
在C/C++代碼中,直接使用""定義的字符串為窄字節串,而windows頭文件中提供的TEXT宏可以根據是否定義了UNICODE宏來自動選擇字符串類型。
因此,利用TEXT宏使其自動選擇了正確的字符集,dll調用成功。
(2)dll里有全局變量初始化失敗或dllmain函數返回false。這種情況需要根據自己的業務代碼具體分析排除與定位。
(3)64位進程調用了32位dll動態庫的問題。
微軟公司的官方網站針對這個問題描述如下:
在64位的windows系統中,一個64位進程不能加載一個32位dll,同理一個32位進程也不能加載一個64位dll。
如果您真都沒有源碼,只能如此“尷尬”的想正常運行,可以參見資料《64位進程調用32位dll的解決方法 / 程序64位化帶來的問題和思考》
(4)其他原因
4.1 LoadLibrary函數跟LoadLibraryEx函數裝載dll的機制不一樣,前者在裝載dll遇到與該dll依賴的其他dll時會自動裝載,而后者不會。
網上有加載自己的dll無法成功的例子,排除路徑問題的話(最好全路徑),就要考慮該dll是否依賴到其它的dll。
Good Good Study, Day Day Up.
順序 選擇 循環 總結