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目錄和依賴項,可以在程式碼中新增以下一行程式碼也可以生成成功
#prama comment(lib, "myDll.lib")
//此時的myDll.lib的路徑必須能找到的,可以給定一個全路徑如:“c:\\myDll.lib”
所以透過設定依賴項和庫目錄和新增#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 "Windows.h"
typedef int(*Dllfun)(int , int);
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)
int x = 1, y = 10;
double z= funName(r, h);
printf("z= %d\n", z);
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;
}