进程间通信实验
一、设计目的
配合嵌入式操作系统 WinCE 课程的学****通过对消息传递和共享内存的实现,加深对
下进程间通信机制的理解。
二、设计内容
在客户端(Client 端)使用 SendMessage 函数发送消息到服务器端(Server 端)或通过
使用内存映像机制实现进程间通信。
在 msgclient 的编辑框中输入字符串,点击 SendMessage,可以将信息发送到 msgserver
程序的“接收到”编辑框中。这是采用 WM_COPYDATA 机制。
在 msgclient 的编辑框中输入字符串,点击 SendToMem,可以将信息发送到 msgserver
程序的“接收历史”多行编辑框中。这是采用 FileMapping 机制。
三、开发环境
Visual Studio 2005 及 WinCE5_ARM_Emulator 模拟器
四、设计原理
由于 WinCE 采用内存保护机制,不允许一个进程访问其它进程的地址空间。但是由于
进程间存在共享数据的需要,因此操作系统提供了一种机制,可以把一个进程地址空间中的
数据复制到另外一个进程的地址空间中。
常见通信方式: 剪贴板( Clipboard) 、 COM/DCOM 、网络套接字( Socket )、
WM_COPYDATA 消息。
在 Win32 中,WM_COPYDATA 消息主要目的是允许在进程间传递只读数据。SDK 文
档推荐用户使用 SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可
能删除和修改数据。这个函数的原型如下:
SendMessage(WM_COPYDATA,wParam, lParam);
其中 wParam 设置为包含数据的窗口句柄,lParam 指向一个 COPYDATASTRUCT 的结
构,其定义为:
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;
DWORD cbData;
PVOID lpData;
}COPYDATASTRUCT;
其中 dwData 为自定义数据, cbData 为数据大小, lpData 为指向数据的指针。需要注
意的是,WM_COPYDATA 消息保证发送的数据从原进程复制到目标进程。但是,
WM_COPYDATA 消息不能发送 HDC、HBITMAP 之类的东西,它们对于目标进程来说是无
效的。目标进程得到这些数据不能在原进程作任何事情,因为它们属于不同的进程。
要实现进程间的数据通信,在发送数据的程序中,首先要找到接收数据进程的窗口句柄
pWnd , 可以用 CWnd::FindWindow(NULL,_ T("DataRecv")) 函数来得到, 其中字符串
"DataRecv"为接收数据的程序名。然后用 SendMessage()函数发送数据,其具体的做法如下
所示,要发送的数据在 Cstring m_msg 中:
COPYDATASTRUCT buf;
= 0;
= () * 2;
1026-S15.进程间通信实验 来自淘豆网www.taodocs.com转载请标明出处.