Posted on 2008-01-02 05:24
MiweiDev 閱讀(13626)
評論(0) 編輯 收藏 引用 所屬分類:
DLL
DLL(動態連接庫),然而可以分為動態調用于靜態調用。下面我分別舉一個例子說說。
1)動態調用:
首先:在VC++6.0中創建 Win32 Dynamic-link library工程創建一個動態連接庫工程:
在頭文件TestDll.h中寫下代碼
extern "C" int __declspec(dllexport) add(int numa, int numb);
在源文件TestDll.cpp中實現改函數:
int __declspec(dllexport) add(int numa, int numb)
{
return numa + numb;
}
其次,創建一個測試程序,TestDemo,創建一個.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;
}
而應用程序對本DLL的調用和對第2節靜態鏈接庫的調用卻有較大差異,下面我們來逐一分析。
首先,語句typedef int ( * lpAddFun)(int,int)定義了一個與add函數接受參數類型和返回值均相同的函數指針類型。隨后,在main函數中定義了lpAddFun的實例addFun;
其次,在函數main中定義了一個DLL HINSTANCE句柄實例hDll,通過Win32 Api函數LoadLibrary動態加載了DLL模塊并將DLL模塊句柄賦給了hDll;
再次,在函數main中通過Win32 Api函數GetProcAddress得到了所加載DLL模塊中函數add的地址并賦給了addFun。經由函數指針addFun進行了對DLL中add函數的調用;
最后,應用工程使用完DLL后,在函數main中通過Win32 Api函數FreeLibrary釋放了已經加載的DLL模塊。
通過這個簡單的例子,我們獲知DLL定義和調用的一般概念:
(1)DLL中需以某種特定的方式聲明導出函數(或變量、類);
(2)應用工程需以某種特定的方式調用DLL的導出函數(或變量、類)。
2)靜態連接:
代碼如下:
#include <iostream>
using namespace std;
#pragma comment(lib,"Testlib.lib")
//.lib文件中僅僅是關于其對應DLL文件中函數的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main()
{
int result = add(2,3);
cout << result << endl;
return 0;
}