Listing 1: msserver.cpp
Mail Slot Server
// msserver.cpp #include <tchar.h> #include <windows.h> #include "msserver.h" #include "msname.h" BOOL CALLBACK ServerDlgProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInst; HANDLE hMailSlot; //--------------------------------------------------------------- int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { // The mailslot server creates the mailslot that will be used // by the mailslot clients and reads messages from it. TCHAR szSlotName[MAX_PATH]; lstrcpy(szSlotName, TEXT("\\\\.\\mailslot\\")); lstrcat(szSlotName, MY_MAILSLOT_NAME); hMailSlot = CreateMailslot(szSlotName, // mailslot name 0, // max message size 5000, // wait 5 sec for msg (LPSECURITY_ATTRIBUTES)NULL); if (hMailSlot == INVALID_HANDLE_VALUE) { return FALSE; } // Create the dialog box to display mailslot information. hInst = hInstance; DialogBox(hInst, MAKEINTRESOURCE(SERVER_DLG), NULL, ServerDlgProc); // Close the mailslot handle. CloseHandle(hMailSlot); return 0; } // WinMain //--------------------------------------------------------------- int CALLBACK ServerDlgProc(HWND hDlg, UINT Message,WPARAM wParam, LPARAM lParam) { TCHAR szMsg[1024]; switch (Message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_GETINFO: { // Display current mailslot info. DWORD dwMaxMsgSize = 0, dwNextMsgSize = 0, dwMsgCount = 0, dwReadTimeout = 0; if (GetMailslotInfo(hMailSlot, &dwMaxMsgSize, &dwNextMsgSize, &dwMsgCount, &dwReadTimeout)) { SetDlgItemInt(hDlg, ID_MAXMSGSIZE, dwMaxMsgSize, TRUE); SetDlgItemInt(hDlg, ID_NEXTMSGSIZE, dwNextMsgSize, TRUE); SetDlgItemInt(hDlg, ID_READTIMEOUT, dwReadTimeout, TRUE); SetDlgItemInt(hDlg, ID_MSGCOUNT, dwMsgCount, TRUE); } break; } case ID_READ: // Read and display message from mailslot. DWORD dwBytesRead = 0; if (ReadFile(hMailSlot, (LPBYTE)szMsg, 1024, &dwBytesRead, NULL)) { SetDlgItemText(hDlg, ID_MESSAGE, szMsg); } else { wsprintf(szMsg, TEXT("ReadFile failed (%d)"), GetLastError()); SetDlgItemText(hDlg, ID_MESSAGE, szMsg); } } break; case WM_CLOSE: EndDialog(hDlg, 1); break; default: return FALSE; } return FALSE; } // ServerDlgProc