1.DLL的隱式調用
隱式鏈接采用靜態加載的方式,比較簡單,需要.h、.lib、.dll三件套。新建“控制台應用程序”或“空項目”。配置如下:
項目->屬性->配置屬性->VC++ 目錄-> 在“包含目錄”里添加頭文件testdll.h所在的目錄
項目->屬性->配置屬性->VC++ 目錄-> 在“庫目錄”里添加頭文件testdll.lib所在的目錄
項目->屬性->配置屬性->鏈接器->輸入-> 在“附加依賴項”里添加“testdll.lib”(若有多個 lib 則以空格隔開) 。 //你也可以在代碼中添加一行設置庫的鏈接,#pragma comment(lib, "DLLSample.lib")
庫文件頭文件等目錄設置,本文將庫文件及頭文件拷貝到工程目錄下DLL文件夾下
添加LIB依賴項
#調用的源程序#
// callmyDLL.cpp : 定義控制台應用程序的入口點。 //包含頭頭文件,函數聲明 #include "stdafx.h" #include "stdlib.h" #include "myDLL.h" int _tmain(int argc, _TCHAR* argv[]) {
//這是通過上節的extern方式調用的 int z= Add(1,2);
//也可以通過類導出的方式調用
//CmyDll dll;
//int z = dll.Add(1,2);
printf("z is:%d\n", z); system("pause"); return 0; }
以上如果包含目錄、庫目錄、庫的依賴項都沒有問題就可以生成成功了
#運行時最后一步:將動態庫文件拷貝到可執行文件目錄下,否則會出現如下錯誤。
如何沒有設置lib目錄和依賴項,可以在代碼中添加以下一行代碼也可以生成成功
// callmyDLL.cpp : 定義控制台應用程序的入口點。 //包含頭頭文件,函數聲明 #include "stdafx.h" #include "stdlib.h" #include "myDLL.h" #prama comment(lib, "myDll.lib") //此時的myDll.lib的路徑必須能找到的,可以給定一個全路徑如:“c:\\myDll.lib” int _tmain(int argc, _TCHAR* argv[]) { int z= Add(1,2); printf("z is:%d\n", z); system("pause"); return 0; }
所以通過設置依賴項和庫目錄和添加#Prama是具有相同效果的,如果有問題,得檢查是否兩者的生成平台不同(如win32和x64)或者一個是Debug一個是release
2、DLL顯示調用
對於顯示連接,即動態加載我們需要調用LoadLibrary
在MSDN中:HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
它的功能是映射一個可執行模塊到調用進程的地址空間。由此我們知道顯示調用就是函數指針來調用函數。
Steps:
1、聲明頭文件<windows.h>,說明我想用windows32方法來加載和卸載DLL
2、然后用typedef定義一個指針函數類型.typedef void(*fun) //這個指針類型,要和你調用的函數類型和參數保持一致
3、定一個句柄實例,用來取DLL的實例地址。HINSTANCE hdll;
格式為hdll=LoadLibrary(“DLL地址”);這里字符串類型是LPSTR,當是unicode字符集的時候會不行,
因此要在配置-屬性-常規里面把默認字符集“unicode”改成支持多字符擴展即可。
4、取的地址要判斷,返回的句柄是否為空,如果為無效句柄,那么要釋放加載DLL所占用的內存。
5、定義一個函數指針,用來獲取你要用的函數地址。
然后通過GetProcAdress來獲取函數的地址,參數是DLL的句柄和你要調用的函數名:比如:FUN=(fun)GetProcAdress(hdll,"sum");
這里也要判斷要函數指針是否為空,如果沒取到要求的函數,那么要釋放句柄。
6、然后通過函數指針來調用函數。
7、調用結束后,就釋放句柄FreeLibrary(hdll);
直接上代碼,一一一一一目了然
// callDLLSee.cpp : 定義控制台應用程序的入口點。 //通過調用windowsAPI 來加載和卸載DLL #include "stdafx.h" #include "Windows.h" typedef int(*Dllfun)(int , int); int _tmain(int argc, _TCHAR* argv[]) { Dllfun funName; HINSTANCE hdll; //put DLL under the Debug path //use _T 設置為寬字符 hdll = LoadLibrary( _T("myDLL.dll")); if (hdll == NULL) { FreeLibrary(hdll); } funName = (Dllfun)GetProcAddress(hdll, "Add"); if (funName == NULL) { FreeLibrary(hdll); } int x = 1, y = 10; double z= funName(r, h); printf("z= %d\n", z); FreeLibrary(hdll); return 0; }
參考此系列:http://www.cppblog.com/suiaiguo/archive/2016/01/28/90619.html#212749