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

Delphi DLL 進階應用:全域記憶體實現進程間資料傳輸與窗體重用導論

     編輯:Delphi

動態連結庫(DLL)在 Delphi 中不僅能封裝函式,更可作為進程間通訊(IPC)的共享記憶體容器,並能承載完整的視窗元件實現跨語言窗體重用。本文涵蓋兩大核心主題:利用 GMEM_DDESHARE 全域記憶體實現應用程式間資料交換,以及窗體重用機制的架構優勢。

10.3 利用 DLL 全域記憶體實現資料傳輸

10.3.1 核心原則:記憶體擁有權歸屬

Windows 規定:DLL **不擁有** 其開啟的檔案或分配的全域記憶體塊,這些資源屬於**直接或間接呼叫 DLL 的應用程式**。應用程式結束時,系統自動釋放其擁有的資源。因此,檔案句柄與全域記憶體句柄**不應作為 DLL 全域變數**,而應透過函式參數傳遞,由呼叫端應用程式負責生命週期管理。

特例:若 DLL 需持有獨立全域記憶體,必須使用 GMEM_DDESHARE 標旗分配,此類記憶體直到 DLL 顯式釋放或卸載時才失效。

10.3.2 三步驟實現應用程式間資料傳輸

  1. 編寫 DLL,內含以 GMEM_MOVEABLE and GMEM_DDESHARE 分配的全域記憶體塊;
  2. 服務端程式呼叫 DLL,鎖定記憶體寫入資料;
  3. 客戶端程式呼叫 DLL,鎖定記憶體讀取資料。

10.3.2.1 DLL 實現代碼

var hMem: THandle;

function GetGlobalMem: THandle; export;
begin Result := hMem; end;

begin
  hMem := GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, Num);
  if hMem = 0 then MessageDlg('Could not allocate memory', mtWarning, [mbOK], 0);
end.

GlobalAlloc 參數詳解:

  • GMEM_DDESHARE:可跨進程共享(關鍵)。
  • GMEM_MOVEABLE:可移動記憶體(需配合 GlobalLock/Unlock)。
  • 常用組合:GHND = GMEM_MOVEABLE and GMEM_ZEROINIT。

分配位元組數必須為 32 的倍數;GMEM_DDESHARE 記憶體無需呼叫 GlobalFree,DLL 卸載時自動釋放。

10.3.2.2 服務端寫入資料

var hMem: THandle; pMem: PChar;
begin
  hMem := GetGlobalMem;
  if hMem <> 0 then begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then begin
      StrPCopy(pMem, Memo1.Text);  // 寫入
      GlobalUnlock(hMem);          // 盡早解鎖
    end else MessageDlg('Could not Lock memory block', mtWarning, [mbOK], 0);
  end;
end;

10.3.2.3 客戶端讀取資料

var hMem: THandle; pMem: PChar;
begin
  hMem := GetGlobalMem;
  if hMem <> 0 then begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then begin
      Memo1.Text := StrPas(pMem);  // 讀取
      GlobalUnlock(hMem);
    end else MessageDlg('Could not Lock memory block', mtWarning, [mbOK], 0);
  end;
end;

核心模式:**Lock → 存取 → Unlock**,且盡早解鎖以利系統記憶體管理。

10.4 窗體重用:DLL 的殺手級特性

當需要在不同應用(甚至非 Delphi 應用如 C++、VB)中復用同一個精心設計的窗體時,將其封裝進 DLL 是最佳選擇。

  • 元件庫開銷:含窗體的 DLL 約佔 100KB VCL 開銷;將多個窗體打包進同一 DLL 可共享此開銷,極小化體積。
  • 跨語言呼叫:標準 DLL 匯出函式介面,任何支援 Windows API 呼叫的語言皆可使用。
  • 架構優勢:保護歷史投資、構建模組化元件庫、支援漸進式系統演進。

下一章將詳細演示窗體重用 DLL 的完整設計步驟與雙語言(Delphi/VB)呼叫實戰代碼。

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