1、Windows CE 提供了多种进程间通信的方式。
- 剪贴板(Clipboard):可以使用剪贴板函数在不同进程间复制数据。但是一般只适合图形界面的程序,而且剪贴板都是由用户操作完成的。
- COM / DCOM:通过COM组件的代理 / 存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
- 网络套接字(Socket):通过计算机网络,可以在相同主机或不同主机间交换数据。
- WM_COPYDATA消息: 通过向进程发送WM_COPYDATA消息,将数据放在参数中来传递数据给其他进程。只适合有窗口消息队列的进程。
文件映射(File Mapping),又叫内存映射文件(MMF,Memory-Mapped File)
在Windows CE中,内存映射文件总是会被映射到4GB虚拟地址空间的 0x42000000 到 0x7FFFFFFF 的进程共享区域。利用WincE的内存管理来实现多个进程之间的通信。
打开程序的多个进程,就可以看到运行结果
// 创建文件
hFile = CreateFileForMapping(TEXT("\\Map.dat"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// 创建内存映射文件
hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0x10000,TEXT("MMFObj"));
// 把内存映射文件映射到进程共享地址空间
hMMF = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,NULL);
// 读取内存映送和文件的内容
INT nVal = *((INT *)hMMF);
// 写数据到内存映射文件
*((INT *)hMMF) = 34;
// 清理资源
UnmapViewOfFile(hMMF);
CloseHandle(hMapFile);
CloseHandle(hFile);
点对点消息队列(Point-to-Point Message Queues)
一个进程把消息写入队列,需要这个消息的其他进程,就可以通过从队列中取得消息,从而达到进程间通讯的目的。
在Windows CE的消息队列实现中,消息队列有如下特色:
消息可以是任意的数据类型,事实上消息只是一个任意大小的内存缓冲区。这有利于在不同进程之间进行数据交换。
消息队列还可以用来进行同步。符合典型的生产者消费者模型中的消费者等待问题。
消息是没有优先级的。严格按照先进先出的方式进出队列。
Windows CE中的消息队列是基于点对点操作的,它也不能用来进行广播。
在应用中,消息队列经常用来获得设备的装载 / 卸载通知。