Delphi版内存共享


本文整理自网络,侵删。

  

一.原理

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

二.主要操作

共享内存结构:

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

相关阅读 >>

Delphi 比较两个位图是否相同

Delphi写游戏外挂

Delphi getfilesize 获取文件大小 2

Delphi 文件夹重命名

Delphi 获取系统所有磁盘盘符

Delphi 写变速齿轮外挂

Delphi 无法调用cmd nbtstat命令解决办法

Delphi带进度条复制文件函数

Delphi firedac在后台线程中从mssql server检索记录的方法

Delphi 搜索字符串在流中的位置

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...