下面的代码是线程函数,专门用于处理各种状态
这段代码在进程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;
这段代码在进程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;
if((dwEventMask & EV_RXCHAR) == EV_RXCHAR)........
::WaitCommEvent(_hCommHandle, &dwMask, &_WaitOverlapped)) 调用之后 dwMask值 总是为0
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. 可是我并没有这类操作啊