【问题标题】:C Readfile error 87 when trying to read from mailslot尝试从邮槽读取时 C Readfile 错误 87
【发布时间】:2014-02-07 13:15:45
【问题描述】:

我正在尝试设置一个可以写入和读取的邮槽。

但是当调用 ReadFile 时,我得到错误 87。我尝试了 MSDN 的不同方法,但仍然得到错误 87。

我已经在我的代码中删除了很多错误处理,以便稍微缩短它。

这是我从 main 进行的调用。

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);
}

【问题讨论】:

  • 你的 mailslotRead 被定义为接受 1 个参数 int mailslotRead(HANDLE mailbox) 但你传递给它 3 个参数 mailslotRead(hMailslot,w,i)。
  • 从GetMailslotInfo返回的cMessage的值是多少?
  • 你的选角让我感到震惊。为什么不想让编译器帮助你呢?
  • 无论如何,我相信你将不得不传递一个重叠的结构。
  • @DavidHeffernan 他正在以 MS 示例代码的风格编写。

标签: c readfile mailslot


【解决方案1】:

根据 Microsoft,Error 87 是来自 ReadFile() 或 WriteFile() 的 ERROR_INVALID_PARAMETER

所以这些参数有问题。

同样来自 MS:CreateMailSlot()、CreateFile() 和 ReadFile() 定义

我一直在查看 Using Mailslots 并尝试将其与您所拥有的进行比较。关于我能看到的唯一区别是,即使他们使用FILE_ATTRIBUTE_NORMAL 创建文件,并使用(LPOVERLAPPED) NULL 写入文件,他们在读取文件时仍然提供OVERLAPPED ov - 即使他们的文档说它不是必填。

但是我不知道这是否是实际问题

【讨论】:

  • @DavidHeffernan 这就是我现在想要弄清楚的。我最后一次做纯 Windows 编程是在 90 年代后期
  • 我知道它是无效参数,但由于我没有使用重叠,所以它不应该发生。
  • @PeterM 问题是,即使我添加了 MSDN 中用于使用 createEvent 创建 ov 的精确行,我仍然会遇到相同的错误。
  • @JonathanJuliusSvensson 你能按原样构建和运行 Microsoft 示例吗?
  • @PeterM 结合 MSDN Write 和 Read 再次给我留下错误 87。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2020-06-20
  • 2020-12-30
相关资源
最近更新 更多