LoadLibrary返回126(轉)


原文標題:loadlibrary加載三方dll失敗問題。

前幾天,在聯網測試三方的dll,但是出現dll放到exe目錄下面可以正常加載,如果單獨放一個目錄卻出現126錯誤代碼,找不到指定的模塊。 由於三方dll使用zlib版本和exe使用的zlib版本不同,所以三方的dll又不能放到exe目錄中,必須單獨新建目錄。於是在網上搜索得到以下解決方案:

方式一 采用LoadLibraryEx

若DLL不在調用方的同一目錄下,可以用LoadLibrary(L"DLL絕對路徑")加載。但若調用的DLL內部又調用另外一個DLL,此時調用仍會失敗。解決辦法是用LoadLibraryEx:

LoadLibraryEx("DLL絕對路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統DLL搜索順序從DLL所在目錄開始。


方式二 采用SetCurrentDir

跨目錄調用dll,你應該這樣

1 用GetCurrentDir保存當前的工作目錄
2 用SetCurrentDir將當前的工作目錄,設置為你的DLL所在的路徑,需要使用絕對路徑
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢復到原來的工作路徑

  1. TCHAR chCurDir[MAX_PATH] = {0};  
  2. GetCurrentDirectory(MAX_PATH, chCurDir);  
  3. SetCurrentDirectory(_T("E:\\test\\"));  
  4. m_hDLL = LoadLibrary(_T("MyTest.dll"));  
  5. SetCurrentDirectory(chCurDir);  

 

總結:dll的加載順序:

(1)EXE所在目錄;
(2)當前目錄GetCurrentDirectory();
(3)系統目錄GetSystemDirectory();
(4)WINDOWS目錄GetWindowsDirectory();
(5)環境變量 PATH 所包含的目錄。

所以使用loadlibrary加載dll使用的路徑,但是這個函數會忽略這個路徑,只會按既定規則加載dll。所以如果要加載指定目錄的dll,可以用上述兩個解決方案。

轉自:http://blog.csdn.net/lijianli9/article/details/9091453

ps:我用的是GetModuleFileName獲取exe路徑,然后再掉LoadLibraryEx解決LoadLibrary返回126的錯誤


免責聲明!

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



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