一.原理
通过使用“内存映射文件”,实现内存共享
二.主要操作
共享内存结构:
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