Reading from a Mailslot

The process that creates a mailslot can read messages from it by using the mailslot handle in a call to the ReadFile function. The code in the following example calls the GetMailslotInfo function to determine whether there are messages in the mailslot. If messages are waiting, each is displayed in a message box along with the number of messages remaining to be read.

BOOL WINAPI Readslot(HWND hwnd, HDC hdc) 
{ 
    DWORD cbMessage, cMessage, cbRead; 
    BOOL fResult; 
    LPSTR lpszBuffer; 
    CHAR achID[80]; 
        DWORD cAllMessages; 
 
    cbMessage = cMessage = cbRead = 0; 
 
    // Mailslot handle "hSlot1" is declared globally. 
 
    fResult = GetMailslotInfo(hSlot1, // mailslot handle 
        (LPDWORD) NULL,               // no maximum message size 
        &cbMessage,                   // size of next message 
        &cMessage,                    // number of messages 
        (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)  // retrieve all messages
    { 
        // Create a message-number string. 
 
        wsprintf((LPSTR) achID, 
            "\nMessage #%d of %d\n", cAllMessages - cMessage + 1, 
            cAllMessages); 
 
        // Allocate memory for the message. 
 
        lpszBuffer = (LPSTR) GlobalAlloc(GPTR, 
            lstrlen((LPSTR) achID) + cbMessage); 
 
        lpszBuffer[0] = '\0'; 
 
        fResult = ReadFile(hSlot1, 
            lpszBuffer, 
            cbMessage, 
            &cbRead, 
            (LPOVERLAPPED) NULL); 
 
        if (!fResult) 
        { 
            ErrorHandler(hwnd, "ReadFile"); 
            GlobalFree((HGLOBAL) lpszBuffer); 
            return FALSE; 
        } 
 
        // Concatenate the message and the message-number string. 
 
        lstrcat(lpszBuffer, (LPSTR) achID); 
 
        // Display the message. 
 
        MessageBox(hwnd, 
            lpszBuffer, 
            "Contents of Mailslot", 
            MB_OK); 
 
        GlobalFree((HGLOBAL) lpszBuffer); 
 
        fResult = GetMailslotInfo(hSlot1, // mailslot handle 
            (LPDWORD) NULL,               // no maximum message size 
            &cbMessage,                   // size of next message 
            &cMessage,                    // number of messages 
            (LPDWORD) NULL);              // no read time-out 
 
        if (!fResult) 
        { 
            ErrorHandler(hwnd, "GetMailslotInfo"); 
            return FALSE; 
        } 
    } 
    return TRUE; 
} 
 

A mailslot exists until the CloseHandle function is called for all open server handles or until all server processes that own a mailslot handle exit. In both cases, any unread messages are deleted from the mailslot, all client handles to the mailslot are closed, and the mailslot itself is deleted from memory.