在Wince下支持一種進(jìn)程通信的方法,叫做點對點消息隊列。為了和消息隊列通信,一個或者一對進(jìn)程創(chuàng)建一個讀隊列和一個寫隊列。調(diào)用創(chuàng)建函數(shù)或者打開隊列的函數(shù),只能指定它是讀還是寫,不能同時擁有讀寫權(quán)限。
當(dāng)一個隊列創(chuàng)建時,消息的最大個數(shù)和每條消息的最大長度被定義。如果隊列已經(jīng)填滿,這時進(jìn)行寫操作,寫函數(shù)將被阻塞(等待隊列中出現(xiàn)空的槽),或者是立刻返回失敗,或者是在返回失敗之前等待一段指定的時間。同樣的,讀函數(shù)可以被阻塞,直到隊列中出現(xiàn)新的未讀消息,或者在返回失敗前等待一段時間。
一條消息可以被標(biāo)記為一條“警告”消息。警告消息被送往隊列的最前,這樣下一次讀操作就能夠讀到這條警告消息,而不管隊列中還有多少未讀消息。同一時刻隊列中只能傳送一條警告消息。
說了這么多了,現(xiàn)在開始講一下要用到的哪些API函數(shù):
1、創(chuàng)建消息隊列,調(diào)用這個函數(shù):
HANDLE CreateMsgQueue(
LPCWSTR lpszName,//隊列的名稱
LPMSGQUEUEOPTIONS lpOptions //指向一個MSGQUEUEOPTIONS
);
LpOptions指向一個MSGQUEUEOPTIONS結(jié)構(gòu)體指針,該結(jié)構(gòu)體定義如下:
typedef MSGQUEUEOPTIONS_OS{
DWORD dwSize;//為sizeof(MSGQUEUEOPTIONS)
DWORD dwFlags;//描述隊列的行為有MSGQUEUE_NOPRECOMMIT、//MSGQUEUE_ALLOW_BROKEN
DWORD dwMaxMessages;//同一時刻消息的最大數(shù)目
DWORD cbMaxMessage;// 每條消息最大長度
BOOL bReadAccess; // TRUE-創(chuàng)建讀隊列、FALSE – 創(chuàng)建寫隊列
} MSGQUEUEOPTIONS
如果一個已經(jīng)創(chuàng)建的隊列可以用下面函數(shù)來打開:
HANDLE OpenMsgQueue(
HANDLE hSrcProc,//原來打開隊列的進(jìn)程句柄
HANDLE hMsgQ,//CreagteMsgQueue返回來的句柄
LPMSGQUEUEOPTIONS lpOptions //指向一個MSGQUEUEOPTIONS
);
2、向隊列寫入一條消息,調(diào)用:
BOOL WriteMsgQueue(
HANDLE hMsgQ, // CreagteMsgQueue返回來的句柄
LPVOID lpBuffer,//指向包含消息的緩沖區(qū)
DWORD cbDataSize,//消息大小
DWORD dwTimeout,//指定等待時間
DWORD dwFlags //消息數(shù)據(jù)值
);
3、從隊列讀去消息,調(diào)用:
BOOL ReadMsgQueue(
HANDLE hMsgQ, // CreagteMsgQueue返回來的句柄
LPVOID lpBuffer, //指向接受消息的緩沖區(qū)
DWORD cbBufferSize, //緩沖區(qū)的大小
LPDWORD lpNumberOfBytesRead, //實際讀取的消息大小
DWORD dwTimeout, //指定等待時間
DWORD* pdwFlags //存儲消息數(shù)據(jù)值
);
了解上面的知識就可以寫一個測試程序了,Process A 創(chuàng)建一個名為TEXT("MyQueueName")寫入隊列,Process A 向消息隊列中寫入消息。Process B 創(chuàng)建一個名為TEXT("MyQueueName")讀隊列,Process B 向消息隊列中讀取消息。程序如下:
Process A
Process B