動態連結庫(Dynamic Link Library, DLL)是 Windows 平台實現程式碼共用、模組化、熱更新的核心機制。本文系統整理 DLL 基礎概念、載入流程、導出/導入技巧、記憶體管理、版本衝突解決與實戰最佳實踐。
.dll 副檔名,實為 PE 格式(同 .exe),含導出表| 隱式連結 (Load-time) | 顯式連結 (Run-time) |
|---|---|
連結時指定 .lib 匯入庫 | 程式碼中呼叫 LoadLibrary |
| 啟動時自動載入 | 依需求動態載入/卸載 |
| 缺少 DLL 直接啟動失敗 | 可優雅處理缺失(降級/插件制) |
透過 __declspec(dllimport) 宣告 | 需 GetProcAddress 取得函式指標 |
// MyDLL.h #ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif MYDLL_API int Add(int a, int b); MYDLL_API void __stdcall CallbackFunc(int status); // 建議使用 __stdcall
DllMainBOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH: // 進程載入
DisableThreadLibraryCalls(hModule); // 優化:不需線程通知
break;
case DLL_PROCESS_DETACH: // 進程卸載
// 清理資源
break;
}
return TRUE;
}
禁忌:DllMain 內不可呼叫 LoadLibrary、malloc、同步物件、I/O,易造成死結。
malloc 必須由 DLL 內 free,不可跨模組FreeXXX 函式讓呼叫端釋放 DLL 分配的記憶體std::string(不同 CRT 版本不相容)MyLib_v2.dll 避免覆蓋/DELAYLOAD 連結器選項,首次呼叫才載入精通 DLL 機制,是 Windows 系統程式設計、插件架構、大型專案模組化的必備核心技能。