動態庫
-
動態鏈接庫簡稱DLL,同時以.dll 為后綴,主要用於提供代碼和數據
-
dll 並不是所有數據都能被訪問到,必須要進行導出
-
-
動態鏈接庫在內存中始終只保存了一份數據,起到了節約內存的作用
-
生成動態鏈接庫的時候會附帶一個 lib,這個lib叫做導入庫
-
導入庫同於提供導出函數和數據在 dll 中所處的位置,不提供代碼
-
如果使用隱式鏈接的方式使用動態鏈接庫,必須要 dll 文件
-
-
動態鏈接庫的創建
-
//老師演示的時候是生成兩個文件。一個header.h。一個.cpp。
//自己復習的時候,創建完生成了4個文件:header.h targetver.h dllmain.cpp 動態庫2.cpp -
方法一:聲明導出
1.創建動態庫文件
2.寫文件信息
3.運行。
-
DLL 程序的入口函數(了解),可寫可不寫的函數
-
(寫在dllmain.cpp,函數定義也寫在這)
// DLL 程序的入口函數,會在不同的情況下被調用
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
} -
函數的導出方式:使用聲明進行導出
-
(寫在header.h)
-
DLL 導出的函數不應該有名稱粉碎,所以需要使用 extern "C" 取消名稱粉碎
-
-
-
方法二函數的導出方式:使用模塊定義問文件進行導出
1.創建動態庫文件
2.寫文件
3.設置模板定義
4.運行
-
(寫在header.h)
// 聲明函數
void show1();
void show2();
void show3();
//直接聲明函數,相比方法一,不需要DLLAPI宏定義聲明來粉碎名稱。 -
新建一個文件,后綴名改def。名稱隨意。內容如下。
-
模塊定義文件自己會取消名稱粉碎,推薦使用
EXPORTS
show1 @ 1
show2 @ 2
show3 @ 3 -
-
-
動態鏈接庫的使用方式
-
顯示的使用動態鏈接庫
// 2. 顯示連接,依賴於一組API
HMODULE hModule = LoadLibrary(L"../Debug/04. 動態庫和靜態庫.dll");
// 2.1 如果返回值非 0, 就獲取函數
if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");
// 2.2 如果函數非空,就調用函數
if (fun) fun();-
隱式鏈接使用動態連接庫
// 1. 使用隱式鏈接的方式調用導出函數
-
// 包含頭文件是為了獲取函數的聲明
#### 靜態庫
- 靜態庫的創建

- 靜態庫會生成一個 lib 文件,提供了所有的代碼,又叫做**對象庫**
- (此處截圖用的跟上面動態同一個文件,只是更改了生成方式)
#### 靜態鏈接庫和動態鏈接庫的區別
- 使用 dll 的程序必須自帶 dll,使用 lib 的程序可以不帶 lib
- 使用 dll 的程序通常比較小,使用 lib 的程序通常比較大
- 使用 lib 的程序可以進行跨平台
- 靜態鏈接庫的 lib 和 的動態鏈接庫的 lib 不同,分別是對象庫和導入庫