原文標題: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恢復到原來的工作路徑
- TCHAR chCurDir[MAX_PATH] = {0};
- GetCurrentDirectory(MAX_PATH, chCurDir);
- SetCurrentDirectory(_T("E:\\test\\"));
- m_hDLL = LoadLibrary(_T("MyTest.dll"));
- 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的錯誤