問題描述
使用::LoadLibrary(sdkFullPath)動態加載海康dll,加載失敗,GetLastError返回錯誤碼126。
原因分析
錯誤碼126表示沒有找到指定模塊,但是::LoadLibrary的參數sdk路徑是正確的。
解決方案
最后使用::LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH),沒有出現錯誤。
LoadLibraryEx參數說明
lpLibFileName String,指定要載入的動態鏈接庫的名稱。采用與CreateProcess函數的lpCommandLine參數指定的同樣的搜索順序
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