创建邮槽的过程可以通过在调用ReadFile函数中使用邮件槽句柄来读取邮件。以下示例中的代码调用GetMailslotInfo函数来确定邮槽中是否有消息。如果消息正在等待,则每个消息都显示在消息框中以及剩余的要读取的消息数。
BOOL FAR PASCAL Readslot(HWND hwnd, HDC hdc)
{
DWORD cbMessage, cMessage, cbRead;
BOOL fResult;
LPSTR lpszBuffer;
CHAR achID[80];
DWORD cAllMessages;
cbMessage = cMessage = cbRead = 0;
/ * Mailslot句柄“hSlot1”全局声明。*/
fResult = GetMailslotInfo(hSlot1, /* mailslot handle */
(LPDWORD)NULL,/ * no maximum message size * /
& cbMessage,/ *下一个消息的大小* /
& cMessage,/ *消息数* /
(LPDWORD) NULL); /* no read time-out */
if(!fResult){
ErrorHandler(hwnd, "GetMailslotInfo");
return FALSE;
}
if (cbMessage == MAILSLOT_NO_MESSAGE) {
TextOut(hdc, 10, 10, "No waiting messages.", 20);
return TRUE;
}
cAllMessages = cMessage;
while (cMessage != 0) { /* retrieves each message */
/ *创建一个消息号码字符串。*/
wsprintf(OD(LPSTR)
“\\ nessage#%d of%d \\ n”,cAllMessages - cMessage + 1,
cAllMessages);
/ *为消息分配内存。*/
lpszBuffer = (LPSTR) GlobalAlloc(GPTR,
lstrlen((LPSTR) achID) + cbMessage);
lpszBuffer[0] = '\0';
fResult = ReadFile(hSlot1,
lpszBuffer,
cbMessage,
& cbRead,en
(LPOVERLAPPED) NULL);
if(!fResult){
ErrorHandler(hwnd, "ReadFile");
GlobalFree((HGLOBAL) lpszBuffer);
return FALSE;
}
/ *连接消息和消息编号字符串。*/
lstrcat(lpszBuffer, (LPSTR) achID);
/ *显示消息。*/
MessageBox(hwnd,
lpszBuffer,
“邮件的内容”,
MB_OK);
GlobalFree((HGLOBAL) lpszBuffer);
fResult = GetMailslotInfo(hSlot1, /* mailslot handle */
(LPDWORD)NULL,/ * no maximum message size * /
& cbMessage,/ *下一个消息的大小* /
& cMessage,/ *消息数* /
(LPDWORD) NULL); /* no read time-out */
if(!fResult){
ErrorHandler(hwnd, "GetMailslotInfo");
return FALSE;
}
}
return TRUE;
}
直到为所有打开的服务器句柄调用CloseHandle函数,或者直到拥有邮箱空间句柄的所有服务器进程退出为止。在这两种情况下,从邮槽中删除任何未读消息,邮箱的所有客户机句柄都将关闭,并且邮件槽本身将从内存中删除。