本帖最后由 VisualEleven 于 2011-07-08 22:17:30 编辑

解决方案 »

  1.   

    MSDN上的例子#include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <strsafe.h>HANDLE hSlot;
    LPTSTR 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(LPTSTR 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; 
    }void main()
    {
       MakeSlot(SlotName);   while(TRUE)
       {
          ReadSlot();
          Sleep(3000);
       }
    }
      

  2.   

    本帖最后由 VisualEleven 于 2011-07-10 19:15:27 编辑
      

  3.   

    放到线程中,while循环,这样就可以多次接收.