問題描述:
假定exe呼叫dll,dll內部又呼叫dll1。
dll和dll1與exe不在同一目錄下,而是位於乙個單獨的目錄dlldir下。
現象:
loadlibrary(l"dll"); 載入失敗①。
loadlibrary(l"dll絕對路徑"); 載入失敗②。
失敗原因:
失敗①好理解,失敗②是因為雖然指定了dll絕對路徑作為loadlibrary的引數,但是該引數卻無法對dll內部呼叫的dll1起作用(如果把dll1扔到exe同級目錄下,則可以成功載入),因此無法載入的實際上是dll1。
解決方案:
①loadlibraryex:
loadlibraryex("dll絕對路徑",null, load_with_altered_search_path);
通過指定load_with_altered_search_path,讓系統dll搜尋順序從dll所在目錄開始。
②設定當前目錄:
wchar_t szcurrentdir[max_path] = ; ::getcurrentdirectory(max_path, szcurrentdir); ::setcurrentdirectory(strmodulepath); hmodule hconvertor = loadlibrary(l"dll絕對路徑"); ::setcurrentdirectory(szcurrentdir); ③setdlldirectory: setdlldirectory(l"dll絕對路徑"); loadlibray(l"dll絕對路徑"); setdlldirectory(null); //recover
正確的載入自己寫的dll
怎麼能讓程式正確的載入自己寫的dll 1 把dll放在程式的debug目錄下,在進行關聯。2 直接把dll放在c windows system目錄下 3 新增環境變數 a,system set path path d mydll b,bool winapi setdlldirctory lpctst...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...