从邮箱阅读

【勇芳软件工作室】汉化HomePreviousNext

创建邮槽的过程可以通过在调用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函数,或者直到拥有邮箱空间句柄的所有服务器进程退出为止。在这两种情况下,从邮槽中删除任何未读消息,邮箱的所有客户机句柄都将关闭,并且邮件槽本身将从内存中删除。