关于内存映像的使用,各位帮忙了,多谢(200分)

  • 主题发起人 主题发起人 wisenow
  • 开始时间 开始时间
W

wisenow

Unregistered / Unconfirmed
GUEST, unregistred user!
定义<br>&nbsp; TShareRec = record<br>&nbsp; &nbsp; n: integer;<br>&nbsp; &nbsp; m: integer;<br>&nbsp; &nbsp; //a: string[10];<br>&nbsp; end;<br>&nbsp; TRecArr = array of TShareRec;<br>声明<br>&nbsp; hMap: THandle;<br><br>以下程序在同一程序中Button4Click可以正确执行<br>当把Button4Click代码写到另外的程序时出错, 各位帮忙了,多谢!<br>procedure TForm1.Button3Click(Sender: TObject);<br>var<br>&nbsp; Data: ^TRecArr;<br>&nbsp; a: TRecArr;<br>begin<br>&nbsp; SetLength(a, 3);<br>&nbsp; a[0].m := 1; a[0].n := 2; &nbsp;//a[0].a := 'a';<br>&nbsp; a[1].m := 3; a[1].n := 4; &nbsp;//a[1].a := 'b';<br>&nbsp; a[2].m := 5; a[2].n := 6; &nbsp;//a[2].a := 'c';<br>&nbsp; hMap := CreateFileMapping(DWord($FFFFFFFF), nil, PAGE_READWRITE, 0, 2 * SizeOf(TRecArr), pchar('SHARE_HANDLE'));<br>&nbsp; Data := MapViewofFile(hMap, FILE_MAP_WRITE, 0, 0, 0);<br>&nbsp; Data^ := a;<br>&nbsp; UnMapViewofFile(Data);<br>end;<br><br>procedure TForm1.Button4Click(Sender: TObject);<br>var<br>&nbsp; hRMap: THandle;<br>&nbsp; Data: ^TRecArr;<br>&nbsp; N: integer;<br>begin<br>&nbsp; hRMap := CreateFileMapping(DWORD($FFFFFFFF), nil, PAGE_READONLY, 0, 1, pchar('SHARE_HANDLE'));<br>&nbsp; Data := MapViewofFile(hRMap, FILE_MAP_READ, 0, 0, 0);<br>&nbsp; try<br>&nbsp; &nbsp; Memo1.Lines.Add(IntToStr(Low(Data^)) + '--' + IntToStr(High(Data^)));<br>&nbsp; &nbsp; for n := Low(Data^) to High(Data^) do<br>&nbsp; &nbsp; &nbsp; Memo1.Lines.Add(IntToStr(Data^[n].m) + ':' + IntToStr(Data^[n].n)); //+ //Data^[n].a);<br>&nbsp; finally<br>&nbsp; &nbsp; UnMapViewofFile(Data);<br>&nbsp; &nbsp; CloseHandle(hRMap);<br>&nbsp; end;<br>end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1398887<br>看看上面的贴子是否对你有帮助
 
我是说内存映象文件<br><br>我想在两个进程间共享数据
 
8. 使用内存文件共享来传递数据 <br>在实际应用中,经常要在两个程序间传递数据,经常使用的是Message传递,DDE数据传递以及共享内存传递数据。今天主要来讲一讲如何使用内存共享来传递数据。<br>关于共享内存的函数:<br>CreateFileMapping 使用该函数来创建一个文件映像,返回映像的句柄。<br>HANDLE hFile, //用来创建映像的文件句柄,使用$FFFFFFFF表示在内存中创建<br>LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 属性,可以用NIL来表示 <br>DWORD flProtect, //文件映像的属性 <br>DWORD dwMaximumSizeHigh, // 映像大小的高位 <br>DWORD dwMaximumSizeLow, // 映像大小的低位 <br>LPCTSTR lpName // 映像的名称 <br><br>MapViewOfFile 将映像文件导入现有进程地址空间,返回到映像的内容指针。<br>HANDLE hFileMappingObject, // 映像的句柄 <br>DWORD dwDesiredAccess, // 访问模式 <br>DWORD dwFileOffsetHigh, // 映像偏移的高位 <br>DWORD dwFileOffsetLow, // 映像偏移的地位 <br>DWORD dwNumberOfBytesToMap // 读入多少字节,0表示全部读入<br><br>这次的示例程序在原有HookTest程序上改编,请在这里下载(HookTestEx.zip)<br><br>hooktest.dll<br><br>截取鼠标按下的程序<br>if (nCode=HC_ACTION)and(WPARAM=WM_LBUTTONDOWN)<br>then<br>begin<br>MyMouse:=CPointer(lPARAM);<br>//get the param <br>MyHandle2:=MyMouse^.hwnd;<br>//get the windows handle<br>GetMem(MyString,GetWindowTextlength(myhandle2)+2);<br>GetWindowText(MyHandle2,MyString,GetWindowTextlength(myhandle2)+1);<br>//copy the windows text<br>SetMap(MyString);<br>//set the text to globe share file<br>SendHookMsg;<br>//send the message to the parent window<br>FreeMem(MyString);<br>end;<br><br>将数据写入内存映像SetMap(pBuffer:pchar)<br>hFileMap:=CreateFileMapping(Hwnd($FFFFFFFF),nil,<br>PAGE_READWRITE,0,255,MY_FILE_NAME);<br>if (hFileMap=0)<br>then exit;<br>pMap:=MapViewOfFile(hFileMap,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);<br>if (pMap=nil) then exit;<br>CopyMemory(pMap,pBuffer,255);<br>UnmapViewOfFile(pMap);<br>CloseHandle(hFileMap); <br><br>发出消息SendHookMsg<br><br>hookmain.exe<br>procedure GetHookText(var Message: TMessage); message WM_MYHOOK;<br>用于接受传来的数据<br>hFileMap:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,255,<br>MY_FILE_NAME);<br>if (hFileMap&lt;&gt;0)<br>then<br>begin<br>pMap:=MapViewOfFile(hFileMap,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);<br>if (pMap&lt;&gt;nil)<br>then<br>begin<br>GetMem(MyString,256);<br>CopyMemory(MyString,pMap,255);<br>MyString[255]:=chr(0);<br>Label1.Caption:=MyString;<br>FreeMem(MyString);<br>end;<br>end;<br>通过阅读和运行该程序,应该能掌握内存映像的使用了。<br>
 
jsxjd:<br>&nbsp; Thanks for your answer.<br>&nbsp; 关于共享内存的用法我已经会使用,就是不知道,如何把一个动态数组传递。
 
传递指针和元素个数!
 
谢谢提醒,<br><br>我现在已经实现需要的要求了,就是麻烦了点,是一个一个的传递的<br><br>过后一定按您所提意见实践一下<br><br>我以为大富翁没人了呢?<br><br>再次感谢!
 
接受答案
 
怎么给分的????<br>以下相关问题也是我回答的:<br>http://www.delphibbs.com/delphibbs/dispq.asp?LID=1398887<br>
 
不好意思<br><br>给错了,我在开一个新贴给你200分如何?<br><br>只要你有时间关注一下该贴,我会把ID给贴过来的
 
后退
顶部