在 Windows 環境下,動態連結庫 (DLL) 本身不擁有其開啟的文件或分配的全域記憶體塊。這些資源的所有權歸屬於直接或間接調用該 DLL 的應用程式。當應用程式終止時,系統會自動關閉其擁有的文件並釋放全域記憶體。這意味著儲存在 DLL 全域變數中的文件句柄和記憶體塊,在 DLL 未收到通知的情況下會變得非法,進而導致其他共用該 DLL 的應用程式出現問題。
為了防止這類問題,文件句柄和全域記憶體塊句柄不應作為 DLL 的全域變數,而應作為函數參數傳遞給 DLL 使用。調用應用程式應負責這些資源的維護與釋放。
在特定場景下,DLL 也可以擁有自己的全域記憶體塊。這類記憶體必須使用 GMEM_DDESHARE 屬性分配,這樣的記憶體塊將持續有效,直到被 DLL 顯式釋放或 DLL 卸載為止。由 DLL 管理的這類共享記憶體,正是實現應用程式間數據傳輸的有效途徑。
實現步驟如下:
GMEM_DDESHARE 屬性分配的全域記憶體塊;用於數據傳輸的 DLL 與普通 DLL 編寫方式基本一致,關鍵差異在於:
var
hMem: THandle;
該函數必須包含在 exports 子句中,以便外部程式調用:
function GetGlobalMem: THandle; export;
begin
Result := hMem;
end;

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