Delphi 編寫的 DLL 中定義了新的類(Class)與變量,宿主程序(EXE)加載 DLL 後,如何讓宿主程序識別並使用這些自定義類型?
DLL 與 EXE 編譯為獨立模組,類型資訊不會自動共享。宿主程序編譯時必須「看到」相同的類型定義,否則無法產生正確的代碼引用。
.pas 文件(如 SharedTypes.pas)。uses 子句中包含該單元,確保類型定義完全一致。{ 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 中分別重寫相同類型,否則會導致內存佈局不匹配、存取違規等難以排查的錯誤。