許多開發者以為 DLL 載入後,其全局變量自動映射到宿主進程地址空間。實際上 DLL 與 EXE 擁有獨立的數據段,即使同名變量也互不干擾。
使用 CreateFileMapping + MapViewOfFile 建立命名共享內存區,DLL 與 EXE 映射同一塊物理內存,實現真正的全局變量共享。
{ DLL 端 }
var
hMap: THandle;
pShared: PMyRecord;
initialization
hMap := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TMyRecord), 'Global\\MySharedMem');
pShared := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
finalization
UnmapViewOfFile(pShared);
CloseHandle(hMap);
DLL 導出 function GetVar: Integer; procedure SetVar(Value: Integer);,宿主通過函數調用間接訪問,避免直接暴露變量地址。
PostMessage / SendMessage 傳遞指釖或結構體(需共享內存配合)。| 場景 | 推薦方案 |
|---|---|
| 高頻、小數據、實時性強 | 共享內存 |
| 中低頻、需封裝邏輯 | 導出函數 |
| 跨進程、持久化需求 | 文件/註冊表 |
Delphi DLL 全局變量無法直接被 EXE 訪問。根據性能與架構需求選擇共享內存、導出函數或文件交換,切勿嘗試直接讀取 DLL 數據段地址。