现在的位置: 首页 > 综合 > 正文

WINCE下进程间通信(二)

2014年03月28日 ⁄ 综合 ⁄ 共 3371字 ⁄ 字号 评论关闭

接着前面的文章《WINCE下进程间通信(一)》,现在介绍进程间通信的另一种方法。

 三、管道(消息队列)

       WINCE并不支持类似于PC机上匿名管道、命名管道的通信方式,但CE下提供了一种点对点消息队列的方法,其工作原理与管道非常类似:在通信的两端分别建立一个读队列和写队列,写进程往消息队列一端写入数据,读进程从消息队列另一端读取数据。

       消息队列相关的系统API主要有:CreateMsgQueue()、ReadMsgQueue()、WriteMsgQuue()和CloseMsgQueue()。为了方便消息队列的操作,封装了一个消息队列操作类,参考代码如下:

       头文件(CMsgQueue.h)

  1. /******************************************************************* 
  2.  filename: CMsgQueue.h 
  3.  purpose:   封装了WINCE下消息队列操作类 
  4.  author:    firehood 
  5.  created:   2011.03.23 
  6. ********************************************************************/  
  7. #ifndef _MSG_QUEUE_H  
  8. #define _MSG_QUEUE_H  
  9.   
  10. // 消息队列访问模式  
  11. enum ACCESSMODE  
  12. {  
  13.     ReadMode = 0,  
  14.     WriteMode  
  15. };  
  16.   
  17. // 定义消息回调函数  
  18. typedef BOOL (CALLBACK *MsgQueueCallBack)(PVOID pData, DWORD dwSize);  
  19.   
  20. class CMsgQueue  
  21. {  
  22. public:  
  23.     CMsgQueue();  
  24.     CMsgQueue(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode);  
  25.     ~CMsgQueue();  
  26. public:  
  27.     /********************************************************************** 
  28.     函数名:Create 
  29.     功能:  创建或打开消息队列   
  30.     参数: 
  31.             [in]lpQueueName:    消息队列名称 
  32.             [in]dwSize:         每条消息的最大长度 
  33.             [in]accessMode      消息队列访问模式 ReadMode:只读  WriteMode:只写 
  34.     返回值: 
  35.             成功:TRUE  失败:FALSE 
  36.     **********************************************************************/  
  37.     BOOL Create(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode);  
  38.   
  39.     /********************************************************************** 
  40.     函数名:Read 
  41.     功能:  从消息队列中读取一条消息 
  42.     参数: 
  43.             [out]lpBuffer:            存放读取的数据 
  44.             [in] dwSize:              读取数据的大小 
  45.             [out]lpNumberOfBytesRead  实际读取数据的大小 
  46.             [in] dwTimeout            读取超时时间(ms) 0 立即返回  INFINITE 永远等待直至消息队列中有数据 
  47.     返回值: 
  48.             成功:TRUE  失败:FALSE 
  49.     ***********************************************************************/  
  50.     BOOL Read(LPVOID lpBuffer,DWORD dwSize,LPDWORD lpNumberOfBytesRead,DWORD dwTimeout = 0);  
  51.   
  52.     /********************************************************************** 
  53.     函数名:Write 
  54.     功能:  向消息队列中写入一条消息    
  55.     参数: 
  56.             [in]lpBuffer:      待写入的数据 
  57.             [in]dwSize:        写入数据的大小 
  58.     返回值: 
  59.             成功:TRUE  失败:FALSE 
  60.     **********************************************************************/  
  61.     BOOL Write(LPVOID lpBuffer,DWORD dwSize);  
  62.   
  63.     // 设置消息回调函数  
  64.     BOOL SetMsgCallBack(MsgQueueCallBack pCallBackFun, PVOID pParam);  
  65.     // 关闭消息队列  
  66.     void Close(void);  
  67. private:  
  68.     // 开启读取消息线程  
  69.     BOOL StartRevMsgThread(void);  
  70.     // 停止读取消息线程  
  71.     BOOL StopRevMsgThread(void);  
  72.     // 读取消息线程  
  73.     static void WINAPI RevMsgThread(LPVOID pParam);  
  74. private:  
  75.     HANDLE m_hMsgQueue;  
  76.     DWORD m_dwQueueSize;  
  77.     MsgQueueCallBack m_MsgCallBack;  
  78.     HANDLE m_hRevMsgThread;  
  79.     BOOL m_bThreadExit;  
  80. };  
  81. #endif  

 源文件(CMsgQueue.cpp)

  1. #include "stdafx.h"  
  2. #include "CMsgQueue.h"  
  3.   
  4. CMsgQueue::CMsgQueue()  
  5. {  
  6.     m_hMsgQueue = NULL;  
  7.     m_dwQueueSize = 0;  
  8.     m_hRevMsgThread = NULL;  
  9.     m_bThreadExit = FALSE;  
  10.     m_MsgCallBack = NULL;  
  11. }  
  12.   
  13. CMsgQueue::CMsgQueue(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)  
  14. {  
  15.     Create(lpQueueName,dwSize,accessMode);  
  16. }  
  17.   
  18. CMsgQueue::~CMsgQueue()  
  19. {  
  20.     Close();  
  21. }  
  22.   
  23. BOOL CMsgQueue::Create(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)  
  24. {  
  25.     if(!m_hMsgQueue)  
  26.     {  
  27.         m_hRevMsgThread = NULL;  
  28.         m_bThreadExit = FALSE;  

抱歉!评论已关闭.