这是我的RS232编程部分源码,你参考一下:Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
......    Dim l As Long
    l = CreateEvent(0, True, False, 0)
    If l Then
        olpRead.hEvent = l
    
        l = CreateEvent(0, True, False, 0)
        If l Then
            olpWrite.hEvent = l
            
            l = CreateEvent(0, True, False, 0)
            If l Then
                olpEvents.hEvent = l
            Else
                CloseHandle olpWrite.hEvent
                GoTo LError1
            End If
        Else
        
LError1:
            CloseHandle olpRead.hEvent
            GoTo LError
        End If
    Else
LError:
        Err.Raise vbObjectError + ERR_CREATEEVENT, MYNAME, "不能创建事件。"
    End If
    
......
......Private Sub ReadLoop(ByVal WaitTime As Long)
    Dim l As Long
    
    If blnRead Then
        If WaitForSingleObject(olpRead.hEvent, WaitTime) <> WAIT_TIMEOUT Then
            blnRead = False
            l = olpRead.InternalHigh
            GoTo ReadComplated
        End If
    Else
        Static b(32766) As Byte
        If ReadFile(m_CommID, b(0), m_InBufferSize, l, olpRead) Then 'ReadComplated:
            If l > 0 Then
                strIn = strIn & LeftB$(b(), l)
                
                m_CommEvent = comEvReceive
                RaiseEvent OnComm
            End If
        Else
            If Err.LastDllError = ERROR_IO_PENDING Then
                blnRead = True
                olpRead.InternalHigh = 0
            Else
                m_CommEvent = comEventDCB
                RaiseEvent OnComm
            End If
        End If
    End If
End Sub......

解决方案 »

  1.   

        噢,Sorry! 这只是很多程序中的一个片段,无法简单改写运行。    我想你可能把 Windows 中的 EventObject 和 VB 中的 Event 搞混淆了,它们是截然不同的概念。前者可认为是一个简单意义上的类似 VB 的 Type 类型,创建它后在异步操作中使用。我个人认为它等效于定时检查加DoEvents,满足条件后标记并返回。而后者是通过标准 COM 接口由内向外的一个过程调用,实际上是对象事件接口的一个方法而已。你可以通过在对象浏览器中选中“显示隐含成员”清楚地看到这一点。    我认为你把你的问题复杂化了,你可以简单地增加一个定时器,一旦时间超过十五秒,就触发自己的超时事件。另外,如果你是在用Modem编程,我建议使用RAS, 这样可以不去理会这些问题,集中精力解决你真正需要解决的问题。