| 技術 | 特點 | 連結方式 |
|---|---|---|
| 函式 | 最基礎模組單位 | 靜態編譯 |
| 靜態函式庫 | 函式集合,編譯時鏈入 EXE | 靜態連結 |
| DLL 動態連結庫 | 執行時載入,多程式共享,節省記憶體 | 動態連結 |
| COM 元件 | 跨語言、跨進程、標準化介面 | 執行時繫結 |
需求: DLL 編譯產生的 .lib 匯入庫 + .h 標頭檔。
流程: 連結器讀取 .lib 記錄 DLL 名稱與函式入口 → 程式啟動時 OS 自動載入對應 DLL。
DLL 搜尋順序: 程式目錄 → 目前工作目錄 → 系統目錄 → Windows 目錄 → PATH 環境變數目錄。
VC++ 專案加入 .lib 三法:
#pragma comment(lib, "xxx.lib")(支援條件編譯切換 Debug/Release 版本)加入 .h 並 #include "xxx.h" 即可直接呼叫函式。
適用: 僅有 .dll 檔,無 .lib/.h;或需精確控制載入/卸載時機、節省記憶體。
三步驟 API:
LoadLibrary / AfxLoadLibrary → 取得 HINSTANCEGetProcAddress → 取得函式指標FreeLibrary / AfxFreeLibrary 釋放假設第三方提供 Reg.dll,含檔案加密/解密函式:
// 原型
BOOL WINAPI FileEncrypt(LPCTSTR lpInput, LPCTSTR lpOutput, LPCTSTR lpKey, LPCTSTR lpRegCode);
BOOL WINAPI FileDecrypt(LPCTSTR lpInput, LPCTSTR lpOutput, LPCTSTR lpKey, LPCTSTR lpRegCode);
Reg.lib,標頭檔加入 Reg.h 並 #include "Reg.h"FileEncrypt(...)、FileDecrypt(...)// 加密模組
HINSTANCE hDll = ::LoadLibrary(_T("Reg.dll"));
typedef BOOL (_stdcall *LPFILEENCRYPT)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
LPFILEENCRYPT pEncrypt = (LPFILEENCRYPT)::GetProcAddress(hDll, "FileEncrypt");
if (pEncrypt)
pEncrypt(srcFile, destFile, password, _T("user-12345678"));
::AfxFreeLibrary(hDll);
// 解密模組
hDll = ::LoadLibrary(_T("Reg.dll"));
typedef BOOL (_stdcall *LPFILEDECRYPT)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
LPFILEDECRYPT pDecrypt = (LPFILEDECRYPT)::GetProcAddress(hDll, "FileDecrypt");
if (pDecrypt)
pDecrypt(srcFile, destFile, password, _T("user-12345678"));
::AfxFreeLibrary(hDll);
WINAPI 宏展開為 __stdcall 呼叫慣例,確保 DLL 與呼叫端堆疊平衡一致。extern "C" 避免 C++ 名稱修飾,確保 GetProcAddress 能依名稱找到函式。#pragma comment 搭配條件編譯最佳。DLL 為模組重用核心技術,隱式調用開發效率高,顯式調用部署彈性大。善用 DLL 可大幅降低耦合、提升維護性、減少重複造輪子,是大型 C++ 專案架構不可或缺的一環。