在两个进程间使用内存映射文件共享数据(50分)

  • 主题发起人 主题发起人 滑翔机
  • 开始时间 开始时间

滑翔机

Unregistered / Unconfirmed
GUEST, unregistred user!
我在进程A中打开了要共享的文件、并且成功的将文件视图映射到地址中(命名了文件映射对象)。<br>但在进程B中使用OpenFileMapping打开我在进程A中命名的文件映射对象却总是返回错误。<br>错误代码是2。<br>请教这是怎么回事?
 
是不是A进程是独占打开的?
 
前提是这个MapFile必须是正确的加载到A和B这两个进程的虚拟地址空间里。
 
我使用fileopen是用的参数是fmOpenReadWrite+fmShareDenyNone,是共享的啊。<br>To:wlmmlw<br>我在进程A中加载MapFile成功后,在进程B无法在OpenFileMapping。你说的‘这个MapFile必须是正确的加载到A和B这两个进程的虚拟地址空间里’是什么意思?
 
进程B返回错误代码应该是表明指定的文件句柄已经存在, 这是正常返回<br><br><br><br>Windows还提供了File_Mapping内存共享技术用于实现程序间数据共享。使用与上例窗口相似的两个程序来说明 <br>在MapWrite程序中: <br>Private <br>HMapFile: Thanale; <br>MapFilePointer: Pointer; <br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br>//使用API函数来建立映象文件 <br>hMapFile:=CreateFileMapping( <br>$FFFFFFFF, //指定共享内存 <br>nil, <br>Page_ReadWrite, //共享方式 <br>0, <br>1000, //共享内存大小 <br>′MyMappedFile′); //映象文件的名字 <br>if hMapFile&lt;&gt;0 then //如果映象文件建立成功 <br>//MapViewOfFile函数返回一个指向共享内存块的在该程序内存空间中有效的指针 &nbsp;<br>MapFilePointer:=MapView OfFile(hMapFile,File-Map-All-Access,0,0,0) <br>else <br>ShowMessage(′Can′'t Create MapFile′); <br>if MapFilePointer=nil then <br>ShowMessage(′MapFilePointer=nil′); <br>end; <br>procedure TForm1.Edit1Change(Sender: TObject); <br>begin <br>StrCopy(PChar(MapFilePointer),PChar(Edit1.Text));//将文本框中的字符串copy到共享内存中 <br>end; <br>在MapRead程序中使用API函数OpenFileMapping打开MapWrite程序中已建立的映象文件 <br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br>hMapFile:=OpenFileMapping(FILE_MAP_READ,true,′MyMappedFile′); //取得′MyMappedFile′映象文件的句柄 &nbsp;<br>if hMapFile&lt;&gt;0 then <br>MapFilePointer:=MapViewOfFile(hMapFile,File_Map_All_Access,0,0,0) <br>else <br>begin <br>ShowMessage(′Can not open Mapp File′); <br>Timer1.Enabled:=false; <br>end; <br>end; <br>//定时从共享内存中读取数据并显示出来 <br>procedure TForm1.Timer1Timer(Sender: TObject); <br>var <br>ss: String; <br>begin <br>ss:=PChar(MapFilePointer); <br>Edit1.Text:=ss; <br>end; <br>当然最后我们要释放共享内存句柄 <br>UnMapViewOfFile(MapFilePointer); <br>CloseHandle(hMapFile); &nbsp;
 
By David Spies. <br>如何使用Win32内存映象文件,实现多个程序数据交换<br>http://www.csdn.net/dev/delphi/Samples/mmapfile.zip<br><br>参考看一下
 
后退
顶部