一.原理

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

二.主要操作

    共享内存结构:

  PShareMem = ^TShareMem;TShareMem = Recordid: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 thenbeginSelf.Memo1.Lines.Add('已成功创建内存映射文件!');end;
end;

2)建立映射关系

  //将“内存映射文件”与“应用程序地址空间”建立映射关系pUserInfoShareMem:=MapViewOfFile(fileHandle,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));if pUserInfoShareMem <> nil thenbeginSelf.Memo1.Lines.Add('已成功建立映射关系!');end;

3)写入信息

   pUserInfoShareMem.id:='8888';pUserInfoShareMem.name:='Terry';pUserInfoShareMem.age:=25;Self.Memo1.Lines.Add('已向共享内存中写入用户信息!');

4)解除映射关系

  //解除“内存映射文件”与“应用程序地址空间”的映射关系if pUserInfoShareMem<> nil thenUnmapViewOfFile(pUserInfoShareMem);Self.Memo1.Lines.Add('已成功解除映射关系!');

5)关闭“内存映射文件”

  //关闭内存映射文件if fileHandle<> 0 thenCloseHandle(fileHandle);Self.Memo1.Lines.Add('已成功关闭内存映射文件!');

 

    b)读取程序

1)打开“内存映射文件”

 fileHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,pchar(shareMemName));if self.FileHandle <> 0 thenbeginSelf.Memo1.Lines.Add('已成功打开内存映射文件!')end;

2)建立映射关系

   pUserInfoShareMem:= MapViewOfFile(self.FileHandle,windows.FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));if pUserInfoShareMem <> nil thenbeginSelf.Memo1.Lines.Add('已成功建立映射关系!');end;

3)读取信息

   if pUserInfoShareMem <> nil thenbeginuserInfoStr:='共享内存中获取的用户信息如下:'+#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 thenUnmapViewOfFile(pUserInfoShareMem);Self.Memo1.Lines.Add('已成功解除映射关系!');

5)关闭“内存映射文件”

  if fileHandle<> 0 thenCloseHandle(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

转载于:https://www.cnblogs.com/h2zZhou/p/9475825.html

内存共享【Delphi版】相关推荐

  1. 从内存中加载DLL Delphi版(转)

    源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...

  2. 从内存中加载DLL DELPHI版

    //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows;function memLoadLibrary(pLib: Pointer): ...

  3. Delphi7 内存管理及 FastMM 研究 (对于EXE和DLL内存共享很有用) .

    [转] Delphi7 内存管理及 FastMM 研究 (对于EXE和DLL内存共享很有用) 故国之晚秋 发表于2010-12-06 19:34 浏览(32) 评论(0) 分类: 我的日记       ...

  4. WinAPI【远程注入】利用远程线程注入DLLDelphi版

    { WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...

  5. NeHe的OpenGL教程7(Bang翻译Delphi版)-如何使用光源

    NeHe的OpenGL教程7(Bang翻译Delphi版)-如何使用光源 在这一课里,我将教会你如何用光源照亮立方体的六个面,如下图: 将下图放在应用程序data目录下,起名NeHe.bmp prog ...

  6. NeHe的OpenGL教程8(Bang翻译Delphi版)-如何制作立体透明效果

    NeHe的OpenGL教程8(Bang翻译Delphi版)-如何制作立体透明效果 在这一课里,我将教会你如何制作立体透明效果,如下图: 将下图放在应用程序data目录下,起名NeHe.bmp prog ...

  7. OpenGL教程8(Bang翻译Delphi版)-如何制作立体透明效果 .

    OpenGL教程8(Bang翻译Delphi版)-如何制作立体透明效果 在这一课里,我将教会你如何制作立体透明效果,如下图: 将下图放在应用程序data目录下,起名NeHe.bmp program l ...

  8. Delphi 版 everything、光速搜索代码

    近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: unit uMFTSearchFile; {dbyoung@sina.com201 ...

  9. 修改oracle+sga+size,oracle自动内存共享管理测试。修改 oracle 11g SGA_MAX_SIZE。

    目的,使用oracle 自动内存共享管理 基本都是修改过程.如需整理,请留言 SQL>show parameters target; NAME                           ...

  10. 操作系统内存管理-Linux版

    引言 操作系统内存管理:总的来说,操作系统内存管理包括物理内存管理和虚拟内存管理. 物理内存管理: 包括程序装入等概念.交换技术.连续分配管理方式和非连续分配管理方式(分页.分段.段页式). 虚拟内存 ...

最新文章

  1. java中hashCode()在Map中的作用
  2. bzoj 2724[Violet 6]蒲公英
  3. 每日一皮:给老板演示刚做好的功能...
  4. 哪吒票房逼近40亿,用python爬取哪吒短评分析
  5. 【ABAP】通过ST05分析程序执行路径
  6. 大健康产业里的巨头身影:格局已定但业务创新才刚刚开始
  7. python可以实现什么黑科技_Python黑科技之元类
  8. cocos2d-x游戏实例(7)-A星算法(3)
  9. java怎么插入oracle数据库timenstamp,Sybase数据库技术,数据库恢复专家
  10. Spring @RequestParam批注
  11. 女程序员在这里落脚啦
  12. 硅谷VC想对CIO说这些
  13. eplan如何导入access_EPLAN脚本从入门到应用-2
  14. 11. Swoole 与 ThinkPHP
  15. android反调试之父子调试
  16. 广义线性模型(Generalized Linear Models, GLM)
  17. 仿京东商城登录页面html
  18. MT7628学习笔记(4)——固件烧录(TFTP方式)
  19. 并网逆变器PI控制(并网模式)
  20. 项目延期,不重视过程项目团队将自食其果

热门文章

  1. MD5算法的C++实现
  2. 关于EPOLL的ET和LT模式的深入理解
  3. c编码实现连接redis服务器
  4. yum安装wget失败,替换yum源为阿里yum源并重亲安装
  5. sql 字段很多怎么汇总_利用集算器实现分库汇总
  6. Android studio 设置默认打开项目,默认打开项目方式
  7. 海湾监控计算机,海湾GST-DH9300电气火灾监控图形显示系统软件
  8. python英寸换成厘米代码_Python的新手-尝试将厘米编码为英寸,反之亦...
  9. 频率与振幅的关系图怎么画_手拉手模型怎么画?5步教你分分钟完成模型图
  10. 1.3使用command-line runners