Wince跨进程通信之MsgQueue

来源:互联网 发布:优化公司人事是干啥的 编辑:程序博客网 时间:2024/05/22 15:30

Wince4.0以后的版本中,当进程A要向进程B单向通信时,可以使用消息队列MsgQueue

基本思路是:

      进程B创建一个可读性的消息队列Queue,写一个循环,在循环中读取其他进程写入Queue中的数据

      进程A创建一个与Queue相同名字的可写性消息队列,获得B进程的句柄,打开消息队列,然后写数据

 

具体程序如下:

 

(1)进程B

HANDLE hMsgQRead;
DWORD numRead;
TCHAR buf[30];

MSGQUEUEOPTIONS qoptions =

{
  sizeof(MSGQUEUEOPTIONS),
   MSGQUEUE_NOPRECOMMIT,
   8,//最多只能存在8个消息在消息队列中
   sizeof(buf),//每个消息的最大字节数
   TRUE//可读性消息队列
};
 
hMsgQRead = CreateMsgQueue(TEXT("TESTQUEUE"), &qoptions);
if(hMsgQRead == NULL)
{

      AfxMessageBox( _T( "Create FAIL!" ) );
      return ;
}
 
DWORD Flag;
while( true )
{
      WaitForSingleObject( hMsgQRead, 2 );
      if(ReadMsgQueue(hMsgQRead, buf, 30, &numRead, 2, &Flag) )
      { 
            AfxMessageBox( buf ) ;
      }

}

 

(2)进程A

HANDLE hMsgQWrite;

HANDLE hMsgQOpen;
TCHAR buf[30] = {'G','E','T','/0'};

 

MSGQUEUEOPTIONS qoptions =
{
      sizeof(MSGQUEUEOPTIONS),
      MSGQUEUE_NOPRECOMMIT,
      8,
      sizeof(buf),
      FALSE//可写性消息队列
};
 
hMsgQWrite = CreateMsgQueue(TEXT("TESTQUEUE"), &qoptions);//与B中创建的消息队列名同为"TESTQUEUE"
 
if(hMsgQWrite == NULL)
{
      MessageBox ( _T( " create fail " ) );
      return ;
}
 
HANDLE pr;//进程B句柄
*( int * )&pr= 66;//这里假设进程B句柄值为66,实际编程的话还是要靠读者自己去获得
hMsgQOpen = OpenMsgQueue( pr, hMsgQWrite, &qoptions );
if(hMsgQOpen == NULL)
{
      MessageBox ( _T( " open fail " ) );
      return ;

}
 
WaitForSingleObject(hMsgQOpen, INFINITE);

if(!WriteMsgQueue(hMsgQOpen, buf, 30, 1000, MSGQUEUE_MSGALERT))
{
      MessageBox ( _T( " Write fail " ) );
}

 

原创粉丝点击