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毫秒