DLL 是包含可被多應用程序同時使用的代碼/數據/資源的可執行文件。Windows 核心組件(KERNEL、USER、GDI)均為 DLL。優勢:① 代碼重用 ② 節省內存(共享一份代碼) ③ 模塊化開發 ④ 版本更新不影響應用(接口不變) ⑤ 跨語言調用(C++、VB、Delphi 等)。
File|New|DLL 創建項目export 指示(或 exports 子句).dll 文件library StrLib;
function StrUpperCase(S: PChar): PChar; export;
begin
Result := StrUpper(S);
end;
exports StrUpperCase;
begin end.
DLL 與調用應用共享內存管理器。Delphi DLL 默認使用應用的內存管理器,無需 手動管理內存(如 GetMem/FreeMem)。但若 DLL 獨立分配內存供應用釋放(或反之),需使用共享內存管理器(ShareMem 單元),並確保 DLL 和應用都在 uses 首位引用 ShareMem。
DLL 與應用傳遞字符串推薦用 PChar(空結束字符串),兼容性最好。String 類型因內存管理差異可能導致問題。PChar 需調用者分配足夠緩衝區。
register(寄存器傳參),DLL 導出函數建議用 stdcall 確保跨語言兼容。function MyFunc(P: PChar): Integer; stdcall; export;
兩種導出方式:
export:function Foo: Integer; export;exports 子句(推薦,集中管理,支持重命名/索引):
exports
Foo name 'FooFunc',
Bar index 1;
可選 DllEntryPoint 處理進程/線程附加分離:
function DllEntryPoint(dwReason: DWORD): Boolean;
begin
case dwReason of
DLL_PROCESS_ATTACH: ; // 進程載入
DLL_PROCESS_DETACH: ; // 進程卸載
DLL_THREAD_ATTACH: ; // 線程創建
DLL_THREAD_DETACH: ; // 線程結束
end;
Result := True;
end;