一.原理

通过使用“内存映射文件”,实现内存共享

二.主要操作

共享内存结构:

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,

防止前者已关闭内存映射文件,而后者还没读取。