大型應用程式常由多個獨立功能模組組成。若將所有原始碼靜態連結成單一 EXE,不僅增加檔案大小與記憶體佔用,每次修改還需重新編譯全部程式碼,嚴重影響開發效率。Windows 提供 DLL 機制完美解決此問題。
DLL 包含全域資料、服務函數與資源,載入時映射至呼叫進程的虛擬位址空間。Win32 下每個進程擁有獨立的讀寫全域變數副本;若需進程間共享記憶體,需使用記憶體對映檔或共享資料段。DLL 的堆疊/堆積記憶體來自呼叫進程。
DLL 透過匯出函數表(符號名或序數)對外提供服務。宣告匯出函數:
__declspec(dllexport) int MyFunction(int n);
應用程式宣告對應匯入:
__declspec(dllimport) int MyFunction(int n);
並需在連結時指定匯入庫(.lib)。連結方式分兩種:
LoadLibrary/GetProcAddress 手動載入並取得函數指標,靈活度較高。隱性連結時,連結器將 DLL 匯出符號與 .lib 內容寫入 EXE,執行時 Windows 依此資訊定位並載入 DLL,完成動態連結。重新編譯 DLL 時,若匯出介面未變,應用程式無需重新編譯。