LoadLibrary加載動態庫失敗


【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.

順序 選擇  循環 總結


免責聲明!

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



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