一.原理
通過使用“內存映射文件”,實現內存共享
二.主要操作
共享內存結構:
PShareMem = ^TShareMem; TShareMem = Record id:string[10]; name:string[20]; age:Integer; end;
基本變量:
shareMemName:string; //共享內存名 fileHandle : THandle;//內存映射文件句柄 pUserInfoShareMem : PShareMem;//指向共享內存的指針
a)寫入程序
1)創建“內存映射文件”
begin //創建“內存映射文件” fileHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShareMem), PChar(shareMemName));
if fileHandle <> 0 then begin Self.Memo1.Lines.Add('已成功創建內存映射文件!'); end; end;
2)建立映射關系
//將“內存映射文件”與“應用程序地址空間”建立映射關系 pUserInfoShareMem:=MapViewOfFile(fileHandle,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem)); if pUserInfoShareMem <> nil then begin Self.Memo1.Lines.Add('已成功建立映射關系!'); end;
3)寫入信息
pUserInfoShareMem.id:='8888'; pUserInfoShareMem.name:='Terry'; pUserInfoShareMem.age:=25; Self.Memo1.Lines.Add('已向共享內存中寫入用戶信息!');
4)解除映射關系
//解除“內存映射文件”與“應用程序地址空間”的映射關系 if pUserInfoShareMem<> nil then UnmapViewOfFile(pUserInfoShareMem); Self.Memo1.Lines.Add('已成功解除映射關系!');
5)關閉“內存映射文件”
//關閉內存映射文件 if fileHandle<> 0 then CloseHandle(fileHandle); Self.Memo1.Lines.Add('已成功關閉內存映射文件!');
b)讀取程序
1)打開“內存映射文件”
fileHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,pchar(shareMemName)); if self.FileHandle <> 0 then begin Self.Memo1.Lines.Add('已成功打開內存映射文件!') end;
2)建立映射關系
pUserInfoShareMem:= MapViewOfFile(self.FileHandle,windows.FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem)); if pUserInfoShareMem <> nil then begin Self.Memo1.Lines.Add('已成功建立映射關系!'); end;
3)讀取信息
if pUserInfoShareMem <> nil then begin userInfoStr:='共享內存中獲取的用戶信息如下:'+#13#10; userInfoStr:=userInfoStr+'用戶Id號:'+pUserInfoShareMem.id+#13#10; userInfoStr:=userInfoStr+'用戶姓名:'+pUserInfoShareMem.name+#13#10; userInfoStr:=userInfoStr+'用戶年齡:'+IntToStr(pUserInfoShareMem.age); Self.Memo1.Lines.Add(userInfoStr); end;
4)解除映射關系
if pUserInfoShareMem<> nil then UnmapViewOfFile(pUserInfoShareMem); Self.Memo1.Lines.Add('已成功解除映射關系!');
5)關閉“內存映射文件”
if fileHandle<> 0 then CloseHandle(fileHandle); Self.Memo1.Lines.Add('已成功關閉內存映射文件!');
c)交互順序
1)“寫入程序”創建共享內存,並寫入信息
2)“讀取程序”從共享內存讀取信息,並解除映射,關閉文件
3) “寫入程序”解除映射,關閉文件
PS:“寫入程序”解除映射關系,關閉內存映射文件對“讀取程序”的影響。
1) 寫入程序解除映射關系,不影響讀取程序的讀取操作關閉內存映射文件,會
影響讀取程序的讀取操作
2) 解除映射關系與關閉內存映射文件無順序要求,及時不解除映射關系也可直
接關閉內存映射文件
3) 兩個程序通訊時,要使用sendmessage,同步操作,而不是postmessage,
防止前者已關閉內存映射文件,而后者還沒讀取。
三.其他
1)常駐內存參考:建立磁盤物理文件,而不是內存映射文件
http://topic.csdn.net/u/20070616/08/ec12fda5-63c7-4c60-9c30-04795d70a922.html
2) 原理詳細分析:http://blog.csdn.net/khuang2008/article/details/3949720