Programming 版 (精华区)

发信人: li (星一), 信区: Programming
标  题: Windows 95进程间数据通讯的实现技术(7)
发信站: 紫 丁 香 (Sat Sep 26 16:57:08 1998), 转信

Windows 95进程间数据通讯的实现技术
  如下所示是读写另一进程的共享内存中的数据: 

  ReadProcessMemory((HANDLE)hTargetProcess,(LPSTR)lpsz,m_strGlobal.GetBuffer(_MAX_FIELD), 

  _MAX_FIELD,&cb); 

  WriteProcessMemory((HANDLE)hTargetProcess,(L
PSTR)lpsz,(LPSTR)STARS, 

  m_strGlobal.GetLength(),&cb); 

  4、进程之间的消息发送与接收 

  在实际应用中进程之间需要发送和接收Windows
消息来通知进程间相互通讯,发送方发送通讯的消息
以通知接收方,接收方在收到发送方的消息后就可以
对内存进行读写操作。

  我们在程序设计中采用Windows注册消息进行消
息传递,首先在发送进程初始化过程中进行消息注
册: 

  m_nMsgMapped=::RegisterWindowsMessage("Mapped"); 

  m_nMsgHandle=::RegisterWindowsMessage("Handle"); 

  m_nMsgShared=::RegisterWindowsMessage("Shared"); 

  在程序运行中向接收进程发送消息: 

  CWnd* 
pWndRecv=FindWindow(lpClassName,"Receive"); 


  pWndRecv->SendMessage(m_MsgMapped,0,0); 

  pWndRecv-
>SendMessage(m_nMsgHandle,(UINT)GetCurrentProces
sID(),(LONG)pApp->m_hGlobalHandle); 

  pWndRecv->SendMessage(m_nMsgShared,0,0); 

  可以按如下方式发送WM_COPYDATA消息: 

  static COPYDATASTRUCT cds;//用户存放数据 

  pWnd-
>SendMessage(WM_COPYDATA,NULL,(LONG)&cds); 

  接收方进程初始化也必须进行消息注册: 

  UNIT CRecvApp:: 
m_nMsgMapped=::RegisterWindowsMessage("Mapped"); 

  UNIT 
CRecvApp::m_nMsgHandle=::RegisterWindowsMessage(
"Handle"); 

  UNIT 
CRecvApp::m_nMsgShared=::RegisterWindowsMessage("Shared"); 

  同时映射消息函数如下: 

  ON_REGISTERED_MASSAGE(CRecvApp::m_nM
sgMapped,OnRegMsgMapped) 

  ON_REGISTERED_MASSAGE(CRecvApp::m_nM
sgHandle,OnRegMsgHandle) 

  ON_REGISTERED_MASSAGE(CRecvApp::m_nM
sgShared,OnRegMsgShared) 

  在这些消息函数我们就可以采用上述技术实现接
收进程中数据的读写操作了。 

  5、结束语 

  从以上分析中我们可以看出Windows95的内存管
理与Windows
3.x相比有很多的不同,对进程之间的通讯有较为严格
的限制。这就确保了任何故障程序无法意外地写入用
户的地址空间,而用户则可根据实际情况灵活地进行
进程间的数据通讯,从这一点上来讲Windows95增强
应用程序的强壮性。

  参考文献: 

  1、 David J.Kruglinski, Visual C++技术内幕, 北
京:清华大学出版社,1995. 

  2、 Microsoft Co. Visual C++ 5.0 On Line Help. 

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: club.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.677毫秒