text: ﻿#include <windows.h>
  #include <tchar.h>
  #include <stdio.h>
  #include <strsafe.h>
  
  HANDLE hSlot;
  LPCTSTR SlotName = TEXT("\\\\.\\mailslot\\sample_mailslot");
  
  BOOL ReadSlot()
  {
      DWORD cbMessage, cMessage, cbRead;
      BOOL fResult;
      LPTSTR lpszBuffer;
      TCHAR achID[80];
      DWORD cAllMessages;
      HANDLE hEvent;
      OVERLAPPED ov;
  
      cbMessage = cMessage = cbRead = 0;
  
      hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));
      if (NULL == hEvent)
          return FALSE;
      ov.Offset = 0;
      ov.OffsetHigh = 0;
      ov.hEvent = hEvent;
  
      fResult = GetMailslotInfo(hSlot, // 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)
      {
          printf("GetMailslotInfo failed with %d.\n", GetLastError());
          return FALSE;
      }
  
      if (cbMessage == MAILSLOT_NO_MESSAGE)
      {
          printf("Waiting for a message...\n");
          return TRUE;
      }
  
      cAllMessages = cMessage;
  
      while (cMessage != 0)  // retrieve all messages
      {
          // Create a message-number string. 
  
          StringCchPrintf((LPTSTR)achID,
              80,
              TEXT("\nMessage #%d of %d\n"),
              cAllMessages - cMessage + 1,
              cAllMessages);
  
          // Allocate memory for the message. 
  
          lpszBuffer = (LPTSTR)GlobalAlloc(GPTR,
              lstrlen((LPTSTR)achID) * sizeof(TCHAR) + cbMessage);
          if (NULL == lpszBuffer)
              return FALSE;
          lpszBuffer[0] = '\0';
  
          fResult = ReadFile(hSlot,
              lpszBuffer,
              cbMessage,
              &cbRead,
              &ov);
  
          if (!fResult)
          {
              printf("ReadFile failed with %d.\n", GetLastError());
              GlobalFree((HGLOBAL)lpszBuffer);
              return FALSE;
          }
  
          // Concatenate the message and the message-number string. 
  
          StringCbCat(lpszBuffer,
              lstrlen((LPTSTR)achID) * sizeof(TCHAR) + cbMessage,
              (LPTSTR)achID);
  
          // Display the message. 
  
          _tprintf(TEXT("Contents of the mailslot: %s\n"), lpszBuffer);
  
          GlobalFree((HGLOBAL)lpszBuffer);
  
          fResult = GetMailslotInfo(hSlot,  // 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)
          {
              printf("GetMailslotInfo failed (%d)\n", GetLastError());
              return FALSE;
          }
      }
      CloseHandle(hEvent);
      return TRUE;
  }
  
  BOOL WINAPI MakeSlot(LPCTSTR lpszSlotName)
  {
      hSlot = CreateMailslot(lpszSlotName,
          0,                             // no maximum message size 
          MAILSLOT_WAIT_FOREVER,         // no time-out for operations 
          (LPSECURITY_ATTRIBUTES)NULL); // default security
  
      if (hSlot == INVALID_HANDLE_VALUE)
      {
          printf("CreateMailslot failed with %d\n", GetLastError());
          return FALSE;
      }
      return TRUE;
  }
  
  int main()
  {
      MakeSlot(SlotName);
  
      while (TRUE)
      {
          ReadSlot();
          Sleep(3000);
      }
  }
  