下面的代码是线程函数,专门用于处理各种状态
这段代码在进程EXE下工作的很好
可是在DLL中,却总是捕捉不到EV_RXCHAR 见鬼了 
if(!::SetCommMask(_hCommHandle, _dwMaskEvent))
{
char szBuffer[256];
_snprintf(szBuffer, 255, "%s(%d) : COM%d Call WINAPI SetCommMask(%x, %x) Fail, thread work invalid! GetLastError() = %d;",
__FILE__, __LINE__, _dwPort, _hCommHandle, _dwMaskEvent, GetLastError());
MessageBox(NULL, szBuffer, "Class cnComm", MB_OK);
return 1;
}

COMSTAT Stat;
DWORD dwError;

for(DWORD dwLength, dwMask = 0; _fRunFlag && IsOpen(); dwMask = 0)
{
if(!::WaitCommEvent(_hCommHandle, &dwMask, &_WaitOverlapped))
{
if(::GetLastError() == ERROR_IO_PENDING)// asynchronous
::GetOverlappedResult(_hCommHandle, &_WaitOverlapped, &dwLength, TRUE);
else
continue;
}

if(dwMask == 0)
continue;

switch(dwMask)
{
case EV_RXCHAR :
WriteLog("EV_RXCHAR\r\n") ;;//这个该死状态的总是捕捉不到 ::ClearCommError(_hCommHandle, &dwError, &Stat);
if(Stat.cbInQue >= _dwNotifyNum)
OnReceive();
break;

case EV_TXEMPTY :
WriteLog("EV_TXEMPTY\r\n") 
                                     OnTXEmpty();
break;

case EV_CTS :
WriteLog("EV_CTS\r\n") ;
OnCTS();
break;

case EV_DSR :
WriteLog("EV_DSR\r\n") ;
                                     OnDSR();
break;

case EV_RING :
OnRing();
break;

case EV_RLSD :
OnRLSD();
break;

case EV_BREAK:
OnBreak();
break;

case EV_ERR :
WriteLog("EV_ERR\r\n") ;
OnError();
break;

}//case
        }//for
return 0;

解决方案 »

  1.   

    不能直接判断吧,应该要用&提取出来先
    if((dwEventMask & EV_RXCHAR) == EV_RXCHAR)........
      

  2.   

    LS的老哥,我跟踪了一下,发现:
    ::WaitCommEvent(_hCommHandle, &dwMask, &_WaitOverlapped)) 调用之后 dwMask值 总是为0
              
      

  3.   

    MSDN上讲:
    If a process attempts to change the device handle's event mask by using the SetCommMask function while an overlapped WaitCommEvent operation is in progress, WaitCommEvent returns immediately. The variable pointed to by the lpEvtMask parameter is set to zero. 可是我并没有这类操作啊