使用内存映象实现进程间全局变量计算机等级考试

文章作者 100test 发表时间 2010:01:01 09:30:53
来源 100Test.Com百考试题网


  使用内存映象实现进程间全局变量
  编程时在同一程序中使用全局变量给我们带来了很多方便,大多数程序几乎都离不开全局变量。那么不同的程序之间呢?我们怎样在不同的程序(进程)之间共享数据呢?事实上,你可能已经注意到在不同的进程间使用全局变量在有些场合还是很有必要,这是一项相当有用的技术,基于某中特殊情况我们的确需要在我们开发的不同的程序间共享数据。比如有些软件你会发现安装后不止一个可执行文件,而且在运行时任务栏也不止出现一个进程,但在使用中你发现不同的进程竟向一个单独运行程序一样,效果很好。接下来我们仔细研究一下该技术:
  要在不同进程间共享全局变量,应该首先想到我们可以通过不同的进程在内存中的同一块存储区域读取数据,那里就象一个公共场合一样,我们把这样的区域叫做内存映象文件。通过windows api我们可以很容易的在内存中创建这么一个区域并轻易的读取它。这里需要用到两个关键的api函数:CreateFileMapping和 MapViewOfFile,前者在内存中创建一个内存映象区,它需要一些参数包括这块区域的读写权限,唯一区域名称以及数据大小(这些参数将在下面代码的注释中给予说明,更多的参数说明请参看win sdk的帮助文件或查看msdn);后者返回一个指向这块区域的指针以便在程序中调用。下面我们将通过一个简单的例子来说明,这个例子由两个工程组成,一个通过一个按纽负责向内存映象区写入一个长度为11个字符的字符串(‘how are you‘,通过一个edit读入,如果edit中的字符数大于了11个程序将可能出错),另一个则通过一个按纽读出这个字符串,写入一个edit中。下面是部分的代码(为了节省篇幅,加上程序很简单,有些不会影想你阅读的代码没有贴出):
  我们首先在第一个工程(窗口取名为SetValue)的单元的接口部分声明一个指向即将创建的内存区域的句柄和一个用来向这个区域写数据的指针变量:
  var
  ……
  hFileMapping:HWND.//指向内存区域的句柄来源:考
  SetString:pchar.//这里应该使用标准的windows字符串而非delphi特有的string类型
  这样我们可以在按纽的单击事件中编写相应的代码:
  procedure TForm1.Button1Click(Sender: TObject).
  begin
  hFileMapping:=CreateFileMapping($FFFFFFFF,nil,Page_ReadWrite,0,11,\MapString\).
  //$FFFFFFFF表示使用虚拟文件,注意两个工程中应该使用同一个唯一的名称MapString
  if hFileMapping=0 then
  raise Exception.Create(\Error creating map file!\).
  SetString:=MapViewOfFile(hFileMapping,File_Map_Write,0,0,11).
  strcopy(SetString,pchar(Edit1.Text)).
  //注意这里应该使用拷贝函数而不是直接赋值 SetString:=pchar(Edit1.Text)
  end.
  当然,我们还可以在这个主工程中编写一个释放内存映象的过程:
  procedure TForm1.Button2Click(Sender: TObject).
  begin
  UnMapViewOfFile(SetString).
  if hFileMapping

相关文章


组件实例的命名规则计算机等级考试
打造Delphi中字符串的replace函数计算机等级考试
StatusBar有多个子栏时确定鼠标双击哪一个子栏计算机等级考试
全国计算机等级考试二级笔试样卷Delphi语言程序设计计算机等级考试
使用内存映象实现进程间全局变量计算机等级考试
使用互斥对象让程序只运行一次计算机等级考试
TListView组件显示文件夹中的文件计算机等级考试
tlistview使用:拖放操作计算机等级考试
在Delphi中自己建立交叉表计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛