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

Delphi 宿主程序訪問 DLL 中全局變量的三種方案

     編輯:程式設計綜合問答

核心誤區

許多開發者以為 DLL 載入後,其全局變量自動映射到宿主進程地址空間。實際上 DLL 與 EXE 擁有獨立的數據段,即使同名變量也互不干擾。

三種跨模組數據共享方案

1. 共享內存——最高效、最推薦

使用 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);

2. 導出獲取/設置函數——封裝性好

DLL 導出 function GetVar: Integer; procedure SetVar(Value: Integer);,宿主通過函數調用間接訪問,避免直接暴露變量地址。

3. Windows 消息/文件——適用於低頻、大數據

  • PostMessage / SendMessage 傳遞指釖或結構體(需共享內存配合)。
  • 寫入 INI/JSON 文件,雙方輪詢讀取(實時性差)。

方案選型建議

場景推薦方案
高頻、小數據、實時性強共享內存
中低頻、需封裝邏輯導出函數
跨進程、持久化需求文件/註冊表

總結

Delphi DLL 全局變量無法直接被 EXE 訪問。根據性能與架構需求選擇共享內存、導出函數或文件交換,切勿嘗試直接讀取 DLL 數據段地址。

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