VC 调用WaitforSingleObject报错.该怎么处理

VC 调用WaitforSingleObject报错...
创建 全局变量
//接收报告用的OVERLAPPED。
OVERLAPPED ReadOverlapped;
在初始化函数中

//创建一个事件,提供给ReadFile使用,当ReadFile完成时,
//会设置该事件为触发状态。
ReadOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  //创建一个读报告的线程,挂起状态
pReadReportThread = AfxBeginThread(ReadReportThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
  //如果创建成功,则恢复该线程的运行
if (pReadReportThread!=NULL)
{
pReadReportThread->ResumeThread();
}
在线程中
UINT CMainMonitor::ReadReportThread(LPVOID lp)
{
  while(1)
{
//设置事件为无效状态
ResetEvent(cdlg->ReadOverlapped.hEvent);
  if
  {
  ....
  }
  else
  //等待事情触发
WaitForSingleObject(cdlg->ReadOverlapped.hEvent,INFINITE);

到这一步 就报错 
直接跳到
BOOL AFXAPI AfxPumpMessage()
{
  CWinThread *pThread = AfxGetThread();
  if( pThread )
return pThread->PumpMessage();
  else
return AfxInternalPumpMessage();
}
这....0xC0000005: Access violation reading location 0x00000064.

是什么原因呢?


------解决方案--------------------
探讨
我是用VC编的 如果是单个对话框 一样的程序就没问题...
我的这个是 在一个对话框中 DoModal() 出来的---对话框 对着有影响么?

------解决方案--------------------
cdlg有问题!
------解决方案--------------------
参考:
C/C++ code

///////////////////////////////////////////////////////
int CUload::ReadCommBlock(BYTE *pBlock,int nBlockLen)
{  //return 0 if error
    int     WaitErr;
    BOOL    fReadStart;
    COMSTAT ComStat;
    DWORD   dwErrorFlags,dwLength;

    if (!m_bConnected) return 0;

    if (ClearCommError(m_idComDev,&dwErrorFlags,&ComStat))
    {  //ComStat filled
        if (dwErrorFlags) 
        {
            if     (dwErrorFlags & CE_RXOVER)   AfxMessageBox("Receive Queue overflow");            
            else if(dwErrorFlags & CE_OVERRUN)  AfxMessageBox("Receive Overrun Error");            
            else if(dwErrorFlags & CE_RXPARITY) AfxMessageBox("Receive Parity Error");            
            else if(dwErrorFlags & CE_FRAME )   AfxMessageBox("Receive Framing error");            
            else if(dwErrorFlags & CE_BREAK)    AfxMessageBox("Break Detected");            
            else                                AfxMessageBox("CE_OTHERS");
        }
    }
// nBlockLen may >,=,< ComStat.cbInQue !
    dwLength=min((DWORD)nBlockLen,ComStat.cbInQue);
    if(dwLength>0)
    {  // read required
        fReadStart=ReadFile(m_idComDev,pBlock,dwLength,&dwLength,&m_osRead);    
        if(!fReadStart)
        { // if there was a problem, or the async. operation's still pending ... 
            if(GetLastError()==ERROR_IO_PENDING)
            { // asynchronous i/o is still in progress 
                if (WaitErr=WaitForSingleObject(m_osRead.hEvent,60000))// 1 minute
                {  // time over
                    if(WaitErr==WAIT_TIMEOUT) 
                    {  // time out
                        dwLength=0;
                        AfxMessageBox("Time out !");
                    }// end time out
                }// end waiterr
            } // end io_pending
            else
            { // WaitErr=0.if you SetEvent(m_osRead.hEvent) anywhere else
                GetOverlappedResult(m_idComDev,&m_osRead,&dwLength,FALSE);
                m_osRead.Offset +=dwLength;
            }
        }
    } //end if dwLength>0
    return dwLength;
}

// an work thread to monitor the _CTS and RX_CHAR 
UINT CUload::CommWatchRead(LPVOID lpParam)
{   // return 0=OK 1=Error
    CUload     *pUload=(CUload*)lpParam;
    OVERLAPPED    os;
    DWORD        dwEventMask,dwTransfer;

    memset(&os,0,sizeof(OVERLAPPED));
    os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);// attrb,Manual,init,name
    if (os.hEvent==NULL)
    {
        AfxMessageBox("Can't create Event",MB_ICONSTOP);
        return 1;// error
    }
// set 2 events !
    if (!SetCommMask(pUload->m_idComDev,EV_RXCHAR|EV_CTS)) return 1;
    while (pUload->m_bConnected)
    { // break,only if m_bConnected=NULL 
        dwEventMask=0;
        if(!WaitCommEvent(pUload->m_idComDev,&dwEventMask,&os))
        {    // function fails
            if (GetLastError()==ERROR_IO_PENDING)
            {// TRUE=WaitForSingleObject() should be called inside
                GetOverlappedResult(pUload->m_idComDev,&os,&dwTransfer,TRUE);
                os.Offset+=dwTransfer;
            }
        }
        if((dwEventMask & EV_RXCHAR)==EV_RXCHAR)
        { // some chats received.
             ResetEvent(pUload->m_hPostEventRead);// first reset 
             pUload->PostMessage(WM_COMMNOTIFY,
                                 (WPARAM)1,   // EV_RXCHAR
                                 (LPARAM)0);  // not used
// wait answer
             WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF);
        }
// if not at same time,use else if
        if((dwEventMask & EV_CTS)==EV_CTS)
        {  // CTS changed
            ResetEvent(pUload->m_hPostEventRead);// first reset 
            pUload->PostMessage(WM_COMMNOTIFY,
                                 (WPARAM)0,   // EV_CTS
                                 (LPARAM)0);  // not used
// wait answer
             WaitForSingleObject(pUload->m_hPostEventRead,0xFFFFFFFF);
        }
    }    
    CloseHandle(os.hEvent);
    return 0;// OK
}