接着前面的文章《WINCE下进程间通信(一)》,现在介绍进程间通信的另一种方法。
三、管道(消息队列)
WINCE并不支持类似于PC机上匿名管道、命名管道的通信方式,但CE下提供了一种点对点消息队列的方法,其工作原理与管道非常类似:在通信的两端分别建立一个读队列和写队列,写进程往消息队列一端写入数据,读进程从消息队列另一端读取数据。
消息队列相关的系统API主要有:CreateMsgQueue()、ReadMsgQueue()、WriteMsgQuue()和CloseMsgQueue()。为了方便消息队列的操作,封装了一个消息队列操作类,参考代码如下:
头文件(CMsgQueue.h)
- /*******************************************************************
- filename: CMsgQueue.h
- purpose: 封装了WINCE下消息队列操作类
- author: firehood
- created: 2011.03.23
- ********************************************************************/
- #ifndef _MSG_QUEUE_H
- #define _MSG_QUEUE_H
- // 消息队列访问模式
- enum ACCESSMODE
- {
- ReadMode = 0,
- WriteMode
- };
- // 定义消息回调函数
- typedef BOOL (CALLBACK *MsgQueueCallBack)(PVOID pData, DWORD dwSize);
- class CMsgQueue
- {
- public:
- CMsgQueue();
- CMsgQueue(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode);
- ~CMsgQueue();
- public:
- /**********************************************************************
- 函数名:Create
- 功能: 创建或打开消息队列
- 参数:
- [in]lpQueueName: 消息队列名称
- [in]dwSize: 每条消息的最大长度
- [in]accessMode 消息队列访问模式 ReadMode:只读 WriteMode:只写
- 返回值:
- 成功:TRUE 失败:FALSE
- **********************************************************************/
- BOOL Create(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode);
- /**********************************************************************
- 函数名:Read
- 功能: 从消息队列中读取一条消息
- 参数:
- [out]lpBuffer: 存放读取的数据
- [in] dwSize: 读取数据的大小
- [out]lpNumberOfBytesRead 实际读取数据的大小
- [in] dwTimeout 读取超时时间(ms) 0 立即返回 INFINITE 永远等待直至消息队列中有数据
- 返回值:
- 成功:TRUE 失败:FALSE
- ***********************************************************************/
- BOOL Read(LPVOID lpBuffer,DWORD dwSize,LPDWORD lpNumberOfBytesRead,DWORD dwTimeout = 0);
- /**********************************************************************
- 函数名:Write
- 功能: 向消息队列中写入一条消息
- 参数:
- [in]lpBuffer: 待写入的数据
- [in]dwSize: 写入数据的大小
- 返回值:
- 成功:TRUE 失败:FALSE
- **********************************************************************/
- BOOL Write(LPVOID lpBuffer,DWORD dwSize);
- // 设置消息回调函数
- BOOL SetMsgCallBack(MsgQueueCallBack pCallBackFun, PVOID pParam);
- // 关闭消息队列
- void Close(void);
- private:
- // 开启读取消息线程
- BOOL StartRevMsgThread(void);
- // 停止读取消息线程
- BOOL StopRevMsgThread(void);
- // 读取消息线程
- static void WINAPI RevMsgThread(LPVOID pParam);
- private:
- HANDLE m_hMsgQueue;
- DWORD m_dwQueueSize;
- MsgQueueCallBack m_MsgCallBack;
- HANDLE m_hRevMsgThread;
- BOOL m_bThreadExit;
- };
- #endif
源文件(CMsgQueue.cpp)
- #include "stdafx.h"
- #include "CMsgQueue.h"
- CMsgQueue::CMsgQueue()
- {
- m_hMsgQueue = NULL;
- m_dwQueueSize = 0;
- m_hRevMsgThread = NULL;
- m_bThreadExit = FALSE;
- m_MsgCallBack = NULL;
- }
- CMsgQueue::CMsgQueue(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)
- {
- Create(lpQueueName,dwSize,accessMode);
- }
- CMsgQueue::~CMsgQueue()
- {
- Close();
- }
- BOOL CMsgQueue::Create(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)
- {
- if(!m_hMsgQueue)
- {
- m_hRevMsgThread = NULL;
- m_bThreadExit = FALSE;