首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 動態鏈接庫編程入門:DLL 創建、導出函數、內存管理、字符串處理、調用約定

     編輯:Delphi

10.1 動態鏈接庫概述

DLL 是包含可被多應用程序同時使用的代碼/數據/資源的可執行文件。Windows 核心組件(KERNEL、USER、GDI)均為 DLL。優勢:① 代碼重用 ② 節省內存(共享一份代碼) ③ 模塊化開發 ④ 版本更新不影響應用(接口不變) ⑤ 跨語言調用(C++、VB、Delphi 等)。

10.1.1 Delphi 創建 DLL

  1. IDE File|New|DLL 創建項目
  2. 編寫導出函數/過程,加 export 指示(或 exports 子句)
  3. 編譯生成 .dll 文件

簡單 DLL 示例

library StrLib;
function StrUpperCase(S: PChar): PChar; export;
begin
  Result := StrUpper(S);
end;
exports StrUpperCase;
begin end.

10.1.2 DLL 內存管理

DLL 與調用應用共享內存管理器。Delphi DLL 默認使用應用的內存管理器,無需 手動管理內存(如 GetMem/FreeMem)。但若 DLL 獨立分配內存供應用釋放(或反之),需使用共享內存管理器(ShareMem 單元),並確保 DLL 和應用都在 uses 首位引用 ShareMem。

10.1.3 字符串處理

DLL 與應用傳遞字符串推薦用 PChar(空結束字符串),兼容性最好。String 類型因內存管理差異可能導致問題。PChar 需調用者分配足夠緩衝區。

10.1.4 調用約定

  • stdcall:Win32 API 標準,參數右至左壓棧,被調用者清棧。Delphi 默認 register(寄存器傳參),DLL 導出函數建議用 stdcall 確保跨語言兼容。
  • cdecl:C/C++ 默認,調用者清棧,支持可變參數。
  • pascal:舊 Pascal 約定,參數左至右壓棧。
  • register:Delphi 默認,前三參數用寄存器,其餘壓棧,效率最高但不適合 DLL 導出。
function MyFunc(P: PChar): Integer; stdcall; export;

10.1.5 導出函數

兩種導出方式:

  1. 函數聲明加 export:function Foo: Integer; export;
  2. exports 子句(推薦,集中管理,支持重命名/索引):
    exports
      Foo name 'FooFunc',
      Bar index 1;

10.1.6 DLL 入口點

可選 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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved