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

  • 主题发起人 主题发起人 金卡绣球jk8.com
  • 开始时间 开始时间

金卡绣球jk8.com

Unregistered / Unconfirmed
GUEST, unregistred user!
1.一个我们自己写的程序A.exe 和 A.dll;(当然可以设计修改)<br><br> &nbsp;?问题1:开辟一块1兆以内的【真正内存空间!】(简称AA空间,呵呵必须在俗称的“内存条”里),往里面写入一堆byte数据?(以满足B.exe能够直接读取AA空间的内容)?。<br> &nbsp;<br> &nbsp;把AA空间的首地址作为lParam参数,发消息到 B.exe ,几秒种要来一趟;<br>2.一个其它单位写的程序B.exe ,(不能修改,也不能协商了,它就那样了,C++的);<br>B.exe启动时调用 A.dll的api,给句柄和msg; <br>收到A.exe的消息,根据消息的lParam参数(AA空间的首地址)直接读取AA空间的内容,来后续处理。<br><br>请帮忙解决问题1这一句 ,帮忙到 OK ,谢谢<br><br>QQ 66382746
 
1.一个我们自己写的程序A.exe 和 A.dll;(当然可以设计修改)<br><br> &nbsp;?问题1:开辟一块1兆以内的【真正内存空间!】(简称AA空间,呵呵必须在俗称的“内存条”里),往里面写入一堆byte数据?(以满足B.exe能够直接读取AA空间的内容)?。<br> &nbsp;<br> &nbsp;把AA空间的首地址作为lParam参数,发消息到 B.exe ,几秒种要来一趟;<br>2.一个其它单位写的程序B.exe ,(不能修改,也不能协商了,它就那样了,C++的);<br>B.exe启动时调用 A.dll的api,给句柄和msg; <br>收到A.exe的消息,根据消息的lParam参数(AA空间的首地址)直接读取AA空间的内容,来后续处理。<br><br>请帮忙解决问题1这一句 ,帮忙到 OK ,谢谢<br><br>QQ 66382746
 
“问题价值分必须大于 0 并且小于300。”<br><br>呵呵,差不多再开贴送分了,头一次发贴,不清楚“地面”...
 
现在的情况是:<br>到 B.exe 直接读取AA空间的内容时报错,说不可读!
 
真的需要1M的空间麽,没必要吧,另外,同B程序交换数据只有这一个接口麽?
 
to:tseug<br>对的,【只有这一个接口】!!了;<br><br>需要几十K 到 几百K 的内存空间!<br><br> &nbsp; &quot;没必要吧,...&quot;<br>呵呵,就是这样了,因为B.exe 它就是这样来读数据,没法,A.exe只有“上贡”。
 
用带接口的EXE可以做,注意这个接口不是在create的时候加几个参数,而是用ActiveX那种方法,可以把参数通过接口直接放进去而不用采用内存共享,这种方法可以验证参数传递是否成功,不成功的话会出现地址错误。然后再发一个系统消息,告诉B程序说“我参数传完了,看你的了”,这个时候B程序就开始工作。<br>具体的方法跟EXE调用COM文件一样,使用createolevariant('B.interface')。<br><br>当然了,最简单的方法就是把内容写到文件里,然后让B去读文件(或者注册表),甚至用socket通信(A=SERVER,B=CLIENT,IP=127.0.0.1)也可以实现你要的东西。如果要用Stream来做,建议多看几本书,我也一下子写不了
 
to:pl5th2001<br><br>呵呵,没法啊,因为B.exe 它就只能是收到msg后,转换指针到合适的类型,直接读了。<br>其它的都没辙。
 
我想可能剩“内存映射文件”这条了,但不太清楚咋办
 
用RamDisk 做个虚拟盘,<br>大家都到里面用文件方式读写数据.
 
实际上你已经怎么做了,对 文件映射内存 ,很简单的。<br>请查看 Delphi下深入Windows核心编程 一书,
 
呵呵,B.exe 不能修改!<br><br>它就是要读内存,当自家的一样用。
 
to:张辉明<br><br>呵呵,找到那书的目录果真有这方面的,太谢谢。<br><br>先看看;<br><br>还没开始学Delphi呢,不过大多代码都看得懂。
 
windows下两个进程一般情况下是不能互相访问对方地址空间的内容,简单点的还是用内存映射文件,同意张辉明看 Delphi下深入Windows核心编程
 
如果程序B.exe不能修改,那么用内存映射文件是不行的,因为在2000以上的操作系统,不同的进程,即使对同一个内存映射对象MapViewOfFile(),得到的地址也可能不一样。。<br><br>可行的作法,A.exe将A.dll注入到B.exe中,由A.dll在B.exe中分配一块内存,返回给A.exe,A.exe再发消息给B.exe。。(注: 在2000上可直接用VirtualAllocEx远程分配)
 
举个例子, 跨进程的ListView项目读取函数:<br><br>function ListView_GetItemText_Ex(hwndLV: HWND; i, iSubItem: Integer;<br> &nbsp;pszText: PChar; cchTextMax: Integer): Integer;<br>var<br> &nbsp;LVItem: TLVItem;<br> &nbsp;ProcessID, ProcessHD, Temp: DWORD;<br> &nbsp;MemPoint: Pointer;<br>begin<br> &nbsp;GetWindowThreadProcessId(hwndLV, ProcessID);<br><br> &nbsp;ProcessHD := OpenProcess(<br> &nbsp; &nbsp;PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,<br> &nbsp; &nbsp;FALSE, ProcessID);<br><br> &nbsp;MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem) + cchTextMax,<br> &nbsp; &nbsp;MEM_COMMIT, PAGE_READWRITE);<br><br> &nbsp;LVItem.iSubItem := iSubItem;<br> &nbsp;LVItem.cchTextMax := cchTextMax;<br> &nbsp;LVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TLVItem));<br><br> &nbsp;WriteProcessMemory(ProcessHD, MemPoint, @LVItem, SizeOf(TLVItem), Temp);<br> &nbsp;Result := SendMessage(hwndLV, LVM_GETITEMTEXT, i, Integer(MemPoint));<br><br> &nbsp;ReadProcessMemory(ProcessHD, Pointer(Integer(MemPoint) + SizeOf(TLVItem)),<br> &nbsp; &nbsp;pszText, cchTextMax, Temp);<br><br> &nbsp;VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem) + cchTextMax, MEM_DECOMMIT);<br> &nbsp;VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE);<br>end;
 
两个进程之间共享数据的方法最经典的做法就是内存映射文件阿,或者使用发送wm_copyData消息的方法。
 
楼主开始写数据接口了!
 
to:刘麻子<br><br>呵呵,经您提醒,我原先都忘了说这个:<br>B.exe启动时调用 A.dll的api,给B的主窗句柄和约定msg号; <br><br>谢谢,代码研究一下,还没全看懂,在98、me、2000等以上都可以吗?<br><br>能否 QQ 一下,66382746 ,不会打扰太多的。
 

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
后退
顶部