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

Windows DLL 全域記憶體管理與進程間數據傳輸實戰

     編輯:VC 教學

DLL 全域記憶體的所有權機制

在 Windows 環境下,動態連結庫 (DLL) 本身不擁有其開啟的文件或分配的全域記憶體塊。這些資源的所有權歸屬於直接或間接調用該 DLL 的應用程式。當應用程式終止時,系統會自動關閉其擁有的文件並釋放全域記憶體。這意味著儲存在 DLL 全域變數中的文件句柄和記憶體塊,在 DLL 未收到通知的情況下會變得非法,進而導致其他共用該 DLL 的應用程式出現問題。

避免資源衝突的最佳實踐

為了防止這類問題,文件句柄和全域記憶體塊句柄不應作為 DLL 的全域變數,而應作為函數參數傳遞給 DLL 使用。調用應用程式應負責這些資源的維護與釋放。

特殊情況:DLL 擁有專屬全域記憶體

在特定場景下,DLL 也可以擁有自己的全域記憶體塊。這類記憶體必須使用 GMEM_DDESHARE 屬性分配,這樣的記憶體塊將持續有效,直到被 DLL 顯式釋放或 DLL 卸載為止。由 DLL 管理的這類共享記憶體,正是實現應用程式間數據傳輸的有效途徑。

利用 DLL 實現應用程式間數據傳輸

實現步驟如下:

  1. 編寫一個 DLL,其中包含一個以 GMEM_DDESHARE 屬性分配的全域記憶體塊;
  2. 服務端程式調用 DLL,向該共享記憶體寫入數據;
  3. 客戶端程式調用 DLL,從共享記憶體讀取數據。

DLL 核心代碼實現

用於數據傳輸的 DLL 與普通 DLL 編寫方式基本一致,關鍵差異在於:

1. 定義全域記憶體句柄

var
  hMem: THandle;

2. 導出獲取句柄的函數

該函數必須包含在 exports 子句中,以便外部程式調用:

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

工作原理圖解

DLL 共享記憶體架構圖

通過這種機制,多個獨立進程可以安全地讀寫同一塊物理記憶體,實現高效的進程間通訊 (IPC)。開發時需注意同步機制(如互斥體)的使用,以防止數據競爭。

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