2014-02-07 120 views
2

我想設置一個郵筒,我可以寫入和讀取。C讀取文件錯誤87當試圖從郵筒讀取

但調用的ReadFile時,我得到錯誤87.我已經從MSDN嘗試不同的approaces和我仍然得到錯誤87

爲了縮短一點我已刪除了很多錯誤,在我的代碼處理。

這是我從主要做的調用。

hMailslot= mailslotCreate("\\\\.\\mailslot\\myslot"); //works 
hMailslot=mailslotConnect("\\\\.\\mailslot\\myslot"); //works 
    mailslotWrite(hMailslot,w, lstrlen(w)+1)*sizeof(CHAR); //works 
    mailslotRead(hMailslot); //Error 87 invalid parameter 
    mailslotClose(hMailslot); //? 

這是我的代碼的縮寫版本。

#define TIME_OUT MAILSLOT_WAIT_FOREVER 

HANDLE mailslotCreate (char *name) { 
    HANDLE H = (HANDLE)CreateMailslot(name,0,TIME_OUT,(LPSECURITY_ATTRIBUTES) NULL); 
    return H; 
} 

HANDLE mailslotConnect (char * name) { 

    HANDLE H = CreateFile(name,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
      return H; 
} 

int mailslotWrite(HANDLE mailSlot,void *msg,int msgSize) { 

    DWORD cbWritten; 

    WriteFile(mailSlot, msg, msgSize, &cbWritten, (LPOVERLAPPED) NULL); 

    return cbWritten; 

} 

int mailslotRead (HANDLE mailbox) { 

    DWORD cbMessage, cMessage, cbRead; 
    BOOL fResult; 
    LPTSTR Message; 

    fResult =GetMailslotInfo(mailbox,(LPDWORD) NULL,&cbMessage,&cMessage,(LPDWORD)NULL); 

    if (!fResult) //Works 
    { 
     printf("GetMailslotInfo failed with %d.\n", GetLastError()); 
    } 

     Message = (LPTSTR) calloc(cbMessage,sizeof(char)); 
     Message[0] = '\0'; 


      fResult = ReadFile((HANDLE)mailbox,(LPVOID)Message,(DWORD)cbMessage,LPDWORD)&cbRead,(LPOVERLAPPED) NULL); 

     if (!fResult) //Error 87 
     { 
      printf("ReadFile failed with %d.\n", GetLastError()); 
      free(Message); 
       return 0; 
     } 
     return cbRead; 
} 

int mailslotClose(HANDLE mailSlot){ 
    return CloseHandle(mailSlot); 
} 
+1

你'mailslotRead'被定義爲接受1個參數'INT mailslotRead(HANDLE郵箱)'但你傳遞3個參數' mailslotRead(hMailslot,W,I)'。 – rullof

+0

從'GetMailslotInfo'返回的'cMessage'的值是什麼? –

+0

你的演員讓我感到不安。你爲什麼不想讓編譯器幫助你? –

回答

1

按照微軟,Error 87是的ReadFile()或WriteFile的ERROR_INVALID_PARAMETER()

所以,什麼是錯的那些參數。

從MS

另外:CreateMailSlot()CreateFile()ReadFile()定義

我一直在尋找Using Mailslots,並試圖將其與你有什麼。關於我可以看到的唯一區別是即使他們創建了文件FILE_ATTRIBUTE_NORMAL,並用(LPOVERLAPPED) NULL寫入文件,他們仍然在閱讀文件時提供OVERLAPPED ov - 即使他們的文檔說明它不是必需的。

但是我不知道不夠了解,如果這是實際問題

+0

確實。但究竟是什麼錯誤? –

+0

@DavidHeffernan這就是我現在想弄明白的。我上次在90年代後期做了純粹的Windows編程 –

+0

我知道它是無效的參數,但由於我沒有使用重疊,所以不應該發生。 –