一,、動態(tài)鏈接庫簡介
動態(tài)鏈接庫英文為DLL,,是Dynamic Link Library 的縮寫形式,,DLL是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫
,DLL不是可執(zhí)行文件,。動態(tài)鏈接提供了一種方法,,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于
一個 DLL 中,,該 DLL 包含一個或多個已被編譯,、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和
資源,。多個應(yīng)用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容,。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。
dll優(yōu)點和作用:
1,、擴展了應(yīng)用程序的特性,;
2、可以用許多種編程語言來編寫,;
3,、簡化了軟件項目的管理;
4,、有助于節(jié)省內(nèi)存,;
5、有助于資源共享,;
6、有助于應(yīng)用程序的本地化,;
二,、創(chuàng)建并使用動態(tài)鏈接庫
1.使用_declspec(dllexport)關(guān)鍵字導出函數(shù),使用靜態(tài)調(diào)用dll
在VisualStudio工程向?qū)е薪⒁粋€Windows Console Application,在“應(yīng)用程序類型”選項中選擇DLL,,在“附加選項”中選擇空項目,。如下:
在項目中添加cpp文件,加入代碼如下:
- /**********************************************/
- /*FileName:DllDemo.cpp */
- /**********************************************/
-
- #define DllDemoAPI _declspec(dllexport)
- #include "DllDemo.h"
- #include <stdio.h>
-
- DllDemoAPI int add(int a, int b)
- {
- return a+b;
- }
-
- DllDemoAPI int subtract(int a, int b)
- {
- return a-b;
- }
-
- DllDemoAPI int multiple(int a, int b)
- {
- return a*b;
- }
-
- DllDemoAPI void Point::Print(int x, int y)
- {
- printf("x=%d,y=%d",x,y);
- }
在項目中添加.h頭文件,,加入代碼如下:
- /**********************************************/
- /*FileName:DllDemo.h */
- /**********************************************/
-
- #ifdef DllDemoAPI
- #else
- #define DllDemoAPI _declspec(dllimport)
- #endif
-
- DllDemoAPI int add(int a, int b);
- DllDemoAPI int subtract(int a, int b);
- DllDemoAPI int multiple(int a, int b);
-
- class DllDemoAPI Point
- {
- public:
- void Print(int x, int y);
- };
編輯,,生成,可以看到Debug目錄里生成了以下這些文件:
調(diào)用dll:
新建一個控制臺應(yīng)用程序,,取名InvokeDll,,如下圖:
在InvokeDll.cpp中添加以下代碼:
- // InvokeDll.cpp : 定義控制臺應(yīng)用程序的入口點。
- //
-
- #include "stdafx.h"
- #include <Windows.h>
- #include "..\DllDemo\DllDemo.h"
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- /*加載dll函數(shù)調(diào)用方式為默認調(diào)用方式*/
-
- printf("5+3=%d\n",add(5,3));
-
- Point p;
- p.Print(5,3);
-
-
- return 0;
- }
選擇InvokeDll項目,,點擊右鍵,,選擇“屬性”選項,在“鏈接”選擇的字選項“輸入”|“外部依賴項”中添加DemoDll.lib
編譯運行得結(jié)果:
2.通過應(yīng)用程序定義文件,,并動態(tài)調(diào)用
在VisualStudio工程向?qū)е薪⒁粋€Windows Console Application,,在“應(yīng)用程序類型”選項中選擇DLL,在“附加選項”中選擇空項目,。
在項目中添加cpp文件,,加入代碼如下:
- /**********************************************/
- /*FileName:DllDemo.cpp */
- /**********************************************/
-
- #define DllDemoAPI _declspec(dllexport)
- #include "DllDemo.h"
- #include <stdio.h>
-
- DllDemoAPI int add(int a, int b)
- {
- return a+b;
- }
-
- DllDemoAPI int subtract(int a, int b)
- {
- return a-b;
- }
-
- DllDemoAPI int multiple(int a, int b)
- {
- return a*b;
- }
在項目中添加.def頭文件,加入代碼如下:
- LIBRARY DllDemo
-
- EXPORTS
- add
- subtract
- multiple
編輯,,生成,,可以看到Debug目錄里生成了以下這些文件:
調(diào)用dll:
同上,新建一個控制臺應(yīng)用程序,,取名InvokeDll
在InvokeDll.cpp中添加以下代碼:
- #include "stdafx.h"
- #include <Windows.h>
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- /*加載dll函數(shù)調(diào)用方式為默認調(diào)用方式*/
- HINSTANCE hInst = LoadLibrary(L"DllDemo.dll");
- if(!hInst)
- {
- printf("加載MathFuns.dll失敗!\n");
- }
- typedef int (*DllDemoAPIProc)(int a, int b);
- DllDemoAPIProc Add = (DllDemoAPIProc)::GetProcAddress(hInst,"add");
- printf("5+3=%d\n",Add(5,3));
- ::FreeLibrary(hInst);
-
-
- return 0;
- }
編譯運行得結(jié)果:
|