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

Delphi DLL 程式設計(一)核心篇:靜態/動態呼叫機制與 API 詳細規範

     編輯:Delphi

動態連結庫(DLL)是 Windows 模組化程式設計的基石。Delphi 提供完整的 DLL 開發與呼叫支援,涵蓋靜態與動態兩大呼叫模式,並深度整合 Windows API。本文系統闡述呼叫機制、參數規範與核心 API 細節。

10.2.2 兩種呼叫模式

1. 靜態呼叫(顯式載入 / 靜態連結)

使用 external 宣告,DLL 在應用程式啟動階段由載入器自動載入。

function Instr(SourceStr: PChar; Check: Char): Integer; far; external 'UseStr';
  • 優點:呼叫語法與本地函式無異,程式碼清晰。
  • 缺點:啟動時強制依賴 DLL,若 DLL 缺失則應用無法啟動;無法在運行時動態切換 DLL。

2. 動態呼叫(隱式載入 / 動態連結)

透過 Windows API LoadLibrary、GetProcAddress、FreeLibrary 在運行時手動控制載入與釋放。

  • 適用場景:條件性載入、插件架構、DLL 可選、需支援多版本 DLL 切換。
  • 優點:載入失敗不影響主程式繼續執行;極大靈活性。

10.2.3 靜態呼叫:三種函式定址方式

所有被呼叫函式必須採用 far 遠呼叫慣例(或編譯指令 {$F+})。

  1. 函式名稱:直接使用 DLL 導出名。
    function MyFunc: Integer; far; external 'MyDLL';
  2. 別名:映射至 DLL 內部不同名稱。
    function MyFunc: Integer; far; external 'MyDLL' name 'InternalFunc';
  3. 序數:依導出順序索引(基 1),載入速度最快。
    function MyFunc: Integer; far; external 'MyDLL' index 3;

別名提供命名彈性;序數提升載入效能但維護成本較高(導出順序變更會失效)。

10.2.4 動態呼叫核心 API 詳細規範

1. LoadLibrary:載入 DLL 模組

function LoadLibrary(LibFileName: PChar): THandle;

搜尋順序:

  1. 當前工作目錄
  2. Windows 目錄(GetWindowsDirectory)
  3. Windows System 目錄(GetSystemDirectory)
  4. 應用程式可執行檔所在目錄(GetModuleFileName)
  5. PATH 環境變數列出的目錄
  6. 網路對應目錄

返回值:

  • 成功:模組實例句柄(> 32)
  • 失敗:錯誤碼(< 32),對照表見下。

常見錯誤碼對照:

碼含義
0系統記憶體不足、檔案損壞或非法調用
2找不到指定檔案
3找不到指定路徑
5存取被拒(共享/網路保護錯誤)
8記憶體不足無法啟動應用程式
10Windows 版本不正確
11可執行檔無效(非 Windows 應用或映像錯誤)
20DLL 檔案無效
21需要 32 位擴展

若模組已載入,LoadLibrary 僅遞增引用計數,不重複映射。

2. GetProcAddress:取得函式入口位址

function GetProcAddress(Module: THandle; ProcName: PChar): TFarProc;
  • Module:LoadLibrary 返回句柄(nil 表當前模組)。
  • ProcName:函式名稱字串指標**或**序數值(低字組)。
  • 注意:若使用序數且該序數不存在,仍可能返回非 nil,極易誤判。**強烈建議使用函式名稱**,且拼寫必須與 DLL exports 宣告完全一致。
  • 成功返回函式入口位址(TFarProc),失敗返回 nil。

3. FreeLibrary:釋放 DLL 模組

procedure FreeLibrary(Module: THandle);
  • 遞減模組引用計數;歸零時系統真正卸載模組。
  • 鐵律:每次 LoadLibrary 必須配對一次 FreeLibrary,確保應用結束無殘留模組佔用記憶體。

下一篇將呈現動態呼叫的完整實戰範例:字串搜尋函式的動態載入與強制型別轉換呼叫技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved