DLL(動態(tài)連接庫),然而可以分為動態(tài)調(diào)用于靜態(tài)調(diào)用。下面我分別舉一個例子說說。
1)動態(tài)調(diào)用:
首先:在VC++6.0中創(chuàng)建 Win32 Dynamic-link library工程創(chuàng)建一個動態(tài)連接庫工程:
在頭文件TestDll.h中寫下代碼
extern "C" int __declspec(dllexport) add(int numa, int numb);
在源文件TestDll.cpp中實(shí)現(xiàn)改函數(shù):
int __declspec(dllexport) add(int numa, int numb)
{
return numa + numb;
}
其次,創(chuàng)建一個測試程序,TestDemo,創(chuàng)建一個.cpp文件,然后放下代碼:
HINSTANCE hinstance;
typedef int (*lpAdd)(int a, int b);
lpAdd lpadd;
int main()
{
hinstance = LoadLibrary("E:\\vc\\DLL\\TestDll\\Debug\\TestDll.dll");
lpadd = (lpAdd)GetProcAddress(hinstance, "add");
cout << "2 + 3 = " << lpadd(2, 3) << endl;
FreeLibrary(hinstance);
return 0;
}
而應(yīng)用程序?qū)Ρ綝LL的調(diào)用和對第2節(jié)靜態(tài)鏈接庫的調(diào)用卻有較大差異,下面我們來逐一分析。
首先,語句typedef int ( * lpAddFun)(int,int)定義了一個與add函數(shù)接受參數(shù)類型和返回值均相同的函數(shù)指針類型。隨后,在main函數(shù)中定義了lpAddFun的實(shí)例addFun;
其次,在函數(shù)main中定義了一個DLL HINSTANCE句柄實(shí)例hDll,通過Win32 Api函數(shù)LoadLibrary動態(tài)加載了DLL模塊并將DLL模塊句柄賦給了hDll;
再次,在函數(shù)main中通過Win32 Api函數(shù)GetProcAddress得到了所加載DLL模塊中函數(shù)add的地址并賦給了addFun。經(jīng)由函數(shù)指針addFun進(jìn)行了對DLL中add函數(shù)的調(diào)用;
最后,應(yīng)用工程使用完DLL后,在函數(shù)main中通過Win32 Api函數(shù)FreeLibrary釋放了已經(jīng)加載的DLL模塊。
通過這個簡單的例子,我們獲知DLL定義和調(diào)用的一般概念:
(1)DLL中需以某種特定的方式聲明導(dǎo)出函數(shù)(或變量、類);
(2)應(yīng)用工程需以某種特定的方式調(diào)用DLL的導(dǎo)出函數(shù)(或變量、類)。
2)靜態(tài)連接:
代碼如下:
#include <iostream>
using namespace std;
#pragma comment(lib,"Testlib.lib")
//.lib文件中僅僅是關(guān)于其對應(yīng)DLL文件中函數(shù)的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main()
{
int result = add(2,3);
cout << result << endl;
return 0;
}