我写了一个程序,老是在CloseHandle的时候提示出错!
说是Invalid Handle,希望各位大侠帮忙,谢~

解决方案 »

  1.   

    是你要关闭的Handle无效,原因大多因为没有正确地得到Handle
      

  2.   

    你的Handle是非法的句柄,你单步调试一下,看是地址是什么值,是否具有意义
      

  3.   

    哦,那是什么原因呢??应该怎么解决啊?源码如下:
    HANDLE hd=CreateEvent(NULL,TRUE,FALSE,str);
    if(hd==NULL)
    {
    Sleep(100);
    hd=CreateEvent(NULL,TRUE,FALSE,str);
       if(hd==NULL)
    {
      return JMJC_PHISICS_OVERLAPPED_EVENT_ERROR;
    }  
    }
    Overlapped.hEvent=hd;
    Overlapped.Offset = 0;
    Overlapped.OffsetHigh = 0;
    DWORD size = 0;
    if(!PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT))
    {
    return JMJC_PHISICS_COMCONFIGERR;
    }

    WriteFile(m_hCom,buf,nCount,&size,&Overlapped);
    DWORD dw=GetLastError();
    if(dw != 0 && dw != ERROR_IO_PENDING)
    {
    return JMJC_PHISICS_COMRWERR;
    }
    else if(dw == ERROR_IO_PENDING)
    {
    if(dw == WAIT_TIMEOUT)
    {
    return JMJC_PHISICS_COMRWERR;
    }
    else if(dw == WAIT_ABANDONED)
    {
    return JMJC_PHISICS_COMRWERR;
    }
    }
    CloseHandle(hd);
      

  4.   

    因为你的str也就是event的名字可能和一些已经存在的event,semaphore,mutex,waitable timer,job或者file mapping object引起ERROR_INVALID_HANDLE,因为这些对象在同一个name space里有相同的名字
      

  5.   

    你应该把Overlapped定义成全局或成员变量, 在打开串口的时候创建事件
    Overlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,str);
    然后在关闭串口的时候再关闭事件
    CloseHandle(Overlapped.hEvent);
      

  6.   

    内核对象的名字最好用GUID, 你改一下再试试看