用LoadLibrary和GetProcAddress加載DLL時,可能會碰到LoadLibrary無法正確加載DLL,返回值總是NULL的情況。一般而言,可按下面的思路解決:
(1)檢查dll的路徑是否正確。
可先用絕對路徑試一下,若可以,那說明相對路徑設置錯了。簡單的測試當面目錄的方法就是隨便寫一個文件,比如std::ofstream outfile("test.txt"),然后看輸出的test.txt文件在哪,就知道當前目錄是哪了,然后依據它設置相對目錄。
(2)檢查LoadLibrary輸入參數字符格式是否正確
LoadLibrary的輸入參數,即DLL的路徑,要求是LPCTSTR類型。一般而言,如果你用
HINSTANCE hFaceDll =LoadLibrary("../bin/dllTest.dll");
這樣的字符格式加載,那么會出現“無法將const char [] 轉換為LPCTSTR”的錯誤。當然,也有可能沒報錯,但是卻不能正確加載,這時候就應在路徑字符串前加"_T",轉換一下格式:
HINSTANCE hFaceDll = LoadLibrary(_T("../bin/dllTest.dll")) ;
(3)檢查具體的錯誤
如果經過上面兩步,還是不能加載,那肯定就是其他錯誤了。你可以自制一個很小的庫(比如里面就放個很小的整數求和函數啥的),加載一下,看下能不能成功,如果你自制的可以正確加載,但目的dll卻不能,那就是目的dll本身的問題。這時候就應該進一步找更具體的問題了。
在LoadLibrary加載語句后面緊跟
std::cout<<GetLastError()<<endl;
一句,調用GetLastError()函數看具體的錯誤代碼。
一般而言,最有可能的錯誤代碼就是“126”,查找GetLastError的錯誤代碼列表,知道錯誤“126”是指錯誤“找不到指定的模塊”,這說明你要加載的dll本身還依賴於其他一些文件,找到這些依賴的文件(一般為一些dll),放到編譯器可以找到的目錄(或在附加庫目錄里設置下這些dll的路徑),編譯,一般就可以通過了。當然,若是其他錯誤代碼,那就要具體問題具體分析了。
附注:查找dll依賴文件的方法
方法一:用vs自帶的命令
dumpbin -imports MyDll.dll
其中"MyDLL.dll"為你要分析的dll文件名。具體操作方式為:打開VS自帶的"Visula Studio命令提示"命令行工具,切換到要分析的dll文件所在目錄下(也可不切換而用全路徑),執行上述命令即可。為了方便瀏覽,最好在命令后面接重定向符“>”定位到一個文本文件中。如:
dumpbin -imports MyDll.dll > result.txt
方法二:下載工具Dependency Walker(http://www.dependencywalker.com/),解壓后運行depends.exe,打開要分析的dll,軟件會自動分析,目標dll依賴的文件不存在的話,會在左側列表中用問號標出,並且下面也有錯誤提示。可依據錯誤提示去找這些依賴文件。另外,有時候,雖然你系統有依賴文件(比如opencv的一些庫),但卻檢測到沒有,很可能是因為你沒設置相應環境變量或者沒有注冊對應dll到注冊表。