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

DLL 開發實戰(一):從零建立 Delphi DLL、導出函數、stdcall 慣例與 ShareMem 避坑指南

     編輯:Delphi

建立 DLL 專案步驟

  1. File → Close All → File → New → DLL。
  2. 專案檔自動生成:
    library Project2;
    uses SysUtils, Classes;
    {$R *.res}
    begin end.
  3. 編寫導出函數(必加 stdcall):
    function MyMax(X, Y: Integer): Integer; stdcall;
    begin
      if X > Y then Result := X else Result := Y;
    end;
  4. 在 exports 區宣告導出名稱(區分大小寫):
    exports
      MyMax;  // 導出名稱必須與此處一致,大小寫敏感
    begin end.
  5. Ctrl+F9 編譯 (非 F9 執行),產生 Project2.dll。

呼叫端靜態導入

function MyMax(X, Y: Integer): Integer; stdcall; external 'MyTestDLL.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(MyMax(30, 50)));  // 50
end;

四大核心規範(違者必崩)

  1. stdcall 強制:Win32 標準呼叫慣例,參數右進左出、被調用者清棧。漏寫導致棧不平衡 → 系統死鎖。
  2. exports 公開:未列入 exports 的函數外部不可見,Quick View 查看 Export Table 可驗證。
  3. 導出名稱大小寫敏感:MyMax ≠ mymax。建議統一 PascalCase。
  4. 跨模組共享 String/動態陣列必用 ShareMem:
    library MyDLL;
    uses
      ShareMem,  // 必須是 uses 子句第一個
      SysUtils, Classes;
    ...
    // 專案檔 .dpr 同樣需首行 uses ShareMem
    
    否則雙方各自管理記憶體 → Access Violation 或記憶體洩漏。
    替代方案:改用 PChar、ShortString、record 等非托管型別。

驗證導出符號

資源管理器右鍵 DLL → Quick View (或用 Dependency Walker、PE Explorer) 查看 Export Table,確認 MyMax 存在。

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