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

Delphi DLL 自定義類型在宿主程序中使用的類型映射方案

     編輯:程式設計綜合問答

核心問題

Delphi 編寫的 DLL 中定義了新的類(Class)與變量,宿主程序(EXE)加載 DLL 後,如何讓宿主程序識別並使用這些自定義類型?

本質原因

DLL 與 EXE 編譯為獨立模組,類型資訊不會自動共享。宿主程序編譯時必須「看到」相同的類型定義,否則無法產生正確的代碼引用。

解決方案:類型映射與共享單元

  1. 建立共享單元: 將類型定義放入一個獨立的 .pas 文件(如 SharedTypes.pas)。
  2. DLL 與 EXE 同時引用: 兩個專案在 uses 子句中包含該單元,確保類型定義完全一致。
  3. 導出函數而非類實例: DLL 導出返回介面或記錄的函數,避免跨模組直接操作類實例的內存佈局差異。

代碼示例

{ SharedTypes.pas }
unit SharedTypes;
interface
type
  TMyRecord = record
    ID: Integer;
    Name: string[50];
  end;
  IMyInterface = interface
    ['{GUID}']
    procedure DoSomething;
  end;
implementation
end.

{ DLL 專案 }
library MyDLL;
uses SharedTypes;
function GetData: TMyRecord; stdcall;
begin
  Result.ID := 1; Result.Name := 'Test';
end;
exports GetData;
end.

{ EXE 專案 }
program HostApp;
uses SharedTypes;
function GetData: TMyRecord; stdcall; external 'MyDLL.dll';
var Rec: TMyRecord;
begin
  Rec := GetData; // 直接使用共享類型
end.

參考資源

詳細映射技巧可參考:Delphi DLL 類型映射實戰

總結

跨模組共享自定義類型的關鍵在於「單一定義源,多處引用」。切勿在 DLL 與 EXE 中分別重寫相同類型,否則會導致內存佈局不匹配、存取違規等難以排查的錯誤。

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