動態連結庫(DLL)源自 C 語言函式庫與 Pascal 庫單元的概念演進。傳統靜態函式庫在連結時會將所需函式碼複製至執行檔,雖利於程式碼重複使用,但在 Windows 多工環境下顯得笨重:若每個程式都包含螢幕輸出、訊息處理、記憶體管理等通用函式的獨立副本,執行檔將龐大不堪。DLL 解決了這個問題——多個同時執行的程式可共享記憶體中單一份 DLL 程式碼,無需重複載入。
「動態連結」揭示了運作原理:連結器不將 DLL 連結至程式,而是等到程式執行並呼叫 DLL 函式時,Windows 才在 DLL 中尋找函式並將其位址傳給呼叫者。此機制極大提升了程式碼複用極限。此外,修改 DLL 中的函式會自動傳播至所有呼叫程式,無需重新編譯應用程式。DLL 亦提供資料共享機制,應用程式可共享 DLL 管理的記憶體資源區塊,僅含共享資料的 DLL 稱為資源檔(如 Windows 字型檔)。
Windows 本身建立在大量 DLL 之上:核心 API(KRNL386.EXE、USER.EXE、GDI.EXE)、驅動程式、字型資源檔(.FON/.FOT)、專用 DLL(如 DDEML.DLL、VER.DLL)。雖 Delphi 開發者常隱性使用這些 DLL,但 Delphi 豐富的函式庫與封裝單元(如 Windows、Messages)使開發者無需直接處理複雜的 API 呼叫格式。本章重點在於自訂 DLL 的撰寫與呼叫。
傳統 Windows DLL 開發繁瑣複雜,需修改定義檔、專案檔等多項設定。Delphi 大幅簡化此流程,更引入視窗元件重用機制——可將設計好的表單儲存於 DLL 中,隨時調用。
在 Delphi 中撰寫 DLL 與一般應用程式差異不大,核心差別在專案檔:
program 開頭,產生 .exe;DLL 專案檔以 library 開頭,產生 .dll。exports 子句列出,且函式/程序需加 export 編譯指示。依功能分類,DLL 分三類:一般功能 DLL、資料交換 DLL、視窗元件重用 DLL。本節專論一般功能 DLL。
program 改 library→移除 Forms 單元→加入 SysUtils、Classes 等單元→清空 begin...end)。export 指示。exports 子句,列出匯出函式/程序,可用 name、index、resident 指示優化呼叫。name 指示指定匯出名稱,如 exports InStr name MyInStr;。外部程式必須用新名稱(MyInStr)呼叫,否則執行時觸發系統錯誤。
index 指示指定序數(1~32767),未指定時由編譯器依序分配。使用序數可加速呼叫。
resident 指示使特定匯出資訊常駐記憶體,避免掃描 DLL 入口點,適合頻繁被呼叫的函式,如 exports InStr name MyInStr resident;。