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 " ) );
}