两个不同EXE之间,真内存共享、进程通信,(第一次、首次发贴,800分,请帮到OK!,还有几千分备用) ( 积分: 300 )

  • 主题发起人 主题发起人 金卡绣球jk8.com
  • 开始时间 开始时间
to:kinneng<br><br>[:D]能否QQ,谢谢
 
没时间聊天,不想下载QQ,我最怕就是上QQ了
 
楼主要用ReadProcessMemory这个API读取其他进程的内存内容.
 
//---------实现内存映射文件的具体方法----------//<br><br>Windows 98和Windows 2000实现内存映射文件的方法是不同的。必须知道这些差别,因<br>为它们会影响你编写代码的方法,也会影响其他应用程序对你的数据进行不利的操作。<br><br><br><br>//---------------------98---------------------//<br><br>在Windows 98下,视图总是映射到0x80000000至0xBFFFFFFF范围内的地址空间分区中。因此,<br>对MapViewOfFile函数的成功调用都会返回这个范围内的一个地址。你也许还记得,所有进程都共<br>享该分区中的数据。这意味着如果进程映射了文件映射对象的视图,那么该文件映射对象的数据<br>实际上就可以被所有进程访问,而不管它们是否已经映射了该文件映射对象的视图。如果另一个<br>进程调用使用同一个文件映射对象的MapViewOfFile函数,Windows 98便将返回给第一个进程的同<br>一个内存地址返回给第二个进程。这两个进程访问相同的数据,并且它们的视图具有相关性。<br><br>在Windows 98中,一个进程可以调用MapViewOfFile函数,并且可以使用某种进程间的通<br>信方式将返回的内存地址传递给另一个进程的线程。一旦该线程收到这个内存地址,该线程就<br>可以成功地访问文件映射对象的同一个视图。但是,不应该这样做,原因有二。<br><br>&amp;#8226; 你的应用程序将无法在Windows 2000下运行,其原因将在下面说明。<br>&amp;#8226; 如果第一个进程调用UnmapViewOfFile函数,地址空间区域将恢复为空闲状态,这意味<br> &nbsp;着第二个进程的线程如果尝试访问视图曾经位于其中的内存,会引发一次访问违规。<br><br>如果第二个进程访问内存映射对象的视图,那么第二个进程中的线程应该调用MapView<br>OfFile函数。当第二个进程这样做的时候,系统将对内存映射视图的使用计数进行递增。因此,<br>如果第一个进程调用UnmapViewOfFile函数,那么在第二个进程也调用UnmapViewOfFile之前,<br>系统将不会释放视图占用的地址空间区域。<br><br>当第二个进程调用MapViewOfFile函数时,返回的地址将与第一个进程返回的地址相同。<br>这样,第一个进程就没有必要使用进程间的通信方式将内存地址传送给第二个进程。<br><br><br>//---------------------2k---------------------//<br><br>Windows 2000实现内存映射文件的方法要比Windows 98好,因为Windows 2000要求在进<br>程的地址空间中的文件数据可供访问之前,该进程必须调用MapViewOfFile函数。如果一个进<br>程调用MapViewOfFile函数,系统将为调用进程的地址空间中的视图进行地址空间区域的倒序<br>操作,这样,其他进程都将无法看到该视图。如果另一个进程想要访问同一个文件映射对象中<br>的数据,那么第二个进程中的线程就必须调用MapViewOfFile,同时,系统将为第二个进程的<br>地址空间中的视图进行地址空间区域的倒序操作。<br><br>值得注意的是,第一个进程调用MapViewOfFile函数后返回的内存地址,很可能不同于第二个<br>进程调用MapViewOfFile函数后返回的内存地址。即使这两个进程映射了相同文件映射对象的视图,<br>它们返回的地址也可能不同。在Windows 98下,MapViewOfFile函数返回的内存地址是相同的,但<br>是,如果想让你的应用程序在Windows 2000下运行,那么绝对不应该指望它们也返回相同的地址。
 
另外一点,98不支持VirtualAllocEx,所以,综上所述,我建议:<br><br> &nbsp;1. 在98用内存映射<br> &nbsp;2. 在2k用VirtualAllocEx
 
还有一个方法, 既然 B.Exe 会调用 A.DLL, 也即 A.DLL 将进入 B.Exe 的进程空间, 那么 可以由 A.DLL 在 B.Exe 进程内直接分配一块内存(比如GetMem), 并且通过某种方式将地址传给 A.Exe(比如发消息), 即可..<br><br><br>当然 A.DLL 最好要判断一下当前所处进程, 比如:<br><br>var<br> &nbsp;PathBuffer: array [0..MAX_PATH] of Char;<br><br>begin<br> &nbsp;PathBuffer[GetModuleFileName(0, @PathBuffer[0], MAX_PATH)] := #0;<br> &nbsp;if CompareAnsiText(ExtractFileName(PathBuffer), 'B.Exe') then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br> &nbsp;begin<br> &nbsp; &nbsp;// ..... GetMem<br> &nbsp; &nbsp;// ..... SendMessage<br> &nbsp; &nbsp;// ..... 其他动作<br> &nbsp;end;<br>end;
 
去书上找找看
 
TO :金卡绣球jk8.com, &nbsp;什么叫“B.exe启动时调用 A.dll的api”?<br>如果是B.exe启动时调用 A.dll的接口,那么 刘麻子 说的第二种最简单方便的。<br>刘麻子,说得第一种方法也是可以了。<br><br>具体怎么做,那本书子,都有例子。
 
98下还有一个未公开函数,用来分配共享内存:<br>function SharedMemoryAlloc(dwSize: DWord): Pointer; stdcall; external 'ComCtl32.dll' Index 71;
 
来自:刘麻子, 时间:2005-11-14 11:25:38, ID:3264723<br>还有一个方法, 既然 B.Exe 会调用 A.DLL, 也即 A.DLL 将进入 B.Exe 的进程空间, 那么 可以由 A.DLL 在 B.Exe 进程内直接分配一块内存(比如GetMem), 并且通过某种方式将地址传给 A.Exe(比如发消息), 即可..<br><br>&gt;&gt;这个【A.dll分配的内存】是和 B.exe在一个进程的了;问题又来了,那【A.dll分配的内存】允许A.exe写入吗?(呵呵,又是不同进程) 、允许B.exe读写吗?<br><br>&gt;&gt;这个A.dll本意仅仅是B.exe调用的(作用就是告诉A.dll,B接收消息的对象是哪);谢谢提示,防止乱开销;<br><br>&gt;&gt;就是这三个A.exe、A.dll、B.exe怎样联系起来,使得B.exe读一块内存来处理,数据提供是由A.exe或A.dll提供的一块内存、并写入数据;A的文件可以修改,B的文件不能动了。<br><br>谢谢
 
To:张辉明 <br>什么叫“B.exe启动时调用 A.dll的api”<br><br>呵呵,是的,B.exe启动加载 A.dll,B关闭了,就一起结束。
 
to:刘麻子<br>98下还有一个未公开函数,用来分配共享内存:<br>function SharedMemoryAlloc(dwSize: DWord): Pointer; stdcall; external 'ComCtl32.dll' Index 71; &nbsp;<br>&gt;&gt;把这个'ComCtl32.dll'弄到 win2000/XP等,可以一样用吗? 释放函数是第几号索引啊,谢谢
 
楼主是不是写接口,我以前写的程序应该下载过了,<br>http://kinneng.go1.icpcn.com/old.htm &nbsp;在Win98下编程,支持2003SP1/XPSP2,<br>可惜源代码跟着刮刮叫的硬盘送给IBM的维修部了,不过原理还是记得起的,但没<br>时间和兴趣重写,是用映射内存和UDP共享数据的,UDP支持本机和局网。按上面的<br>说法,A.exe/A.dll使用映射内存和UDP共享数据,A.dll/B.exe消息就行了,<br>不写A.exe也行,几个b.dll之间也可以共享数据,如果只给一个B.exe使用,就不<br>用共享了,dll的内存跟调用它的exe在同一个空间,是这个exe的一部分,不用考<br>虑共享了,发消息就行。
 
To:kinneng<br>呵呵,是啊;眼力真好;<br>已经给您网站留的邮箱发信了,可以联系一下吗;<br><br>对的,我想采用A.exe/A.dll的方式,光一个dll不太方便;
 
好的,结贴,感谢回帖的各位了!<br><br>有请刘麻子,答谢您的解答(300):<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3265470<br><br>有请kinneng,答谢您的解答(300):<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3265474
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
721
import
I
I
回复
0
查看
584
import
I
后退
顶部