LoadLibrary動態加載dll失敗,GetLastError返回錯誤碼126


問題描述

使用::LoadLibrary(sdkFullPath)動態加載海康dll,加載失敗,GetLastError返回錯誤碼126。

原因分析

錯誤碼126表示沒有找到指定模塊,但是::LoadLibrary的參數sdk路徑是正確的。

解決方案

最后使用::LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH),沒有出現錯誤。

LoadLibraryEx參數說明

lpLibFileName String,指定要載入的動態鏈接庫的名稱。采用與CreateProcess函數的lpCommandLine參數指定的同樣的搜索順序

hFile Long,未用,設為零
dwFlags Long,指定下述常數的一個或多個
DONT_RESOLVE_DLL_REFERENCES:不對DLL進行初始化,僅用於NT
LOAD_LIBRARY_AS_DATAFILE:不准備DLL執行。如裝載一個DLL只是為了訪問它的資源,就可以改善一部分性能
LOAD_WITH_ALTERED_SEARCH_PATH:指定搜索的路徑

LoadLibrary和LoadLibraryEx的區別

兩個函數的主要區別是LoadLibraryEx多了個參數dwFlags,可以設定一些動態加載DLL時的選項。
一般來說,LoadLibraryEx加載DLL時並沒有調用DLL,也就是不會執行DllMain,這樣以來即使DLL本身存在錯誤也會映射成功的。
而LoadLibrary加載時不旦旦映射,還會去調用執行DllMain。
如果確認一個DLL本身不存在問題,但用LoadLibrary加載失敗用LoadLibraryEx加載成功,此時一要看DllMain是否作出了某些限制,二要看DLL本身是否鏈接了其他DLL。

總結

還是沒有太搞清楚使用LoadLibrary加載失敗的詳細原因,感覺是依賴的dll文件找不到,使用LoadLibraryEx可以遍歷子目錄找dll,所以成功了。

之后再看看這個問題,先放放,后續弄明白再更新。

參考

https://blog.csdn.net/cuglifangzheng/article/details/50580279

https://zhidao.baidu.com/question/204625991052212405.html

https://baike.baidu.com/item/LoadLibraryEx/9598009


免責聲明!

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



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