我想你可能把 Windows 中的 EventObject 和 VB 中的 Event 搞混淆了,它们是截然不同的概念。前者可认为是一个简单意义上的类似 VB 的 Type 类型,创建它后在异步操作中使用。我个人认为它等效于定时检查加DoEvents,满足条件后标记并返回。而后者是通过标准 COM 接口由内向外的一个过程调用,实际上是对象事件接口的一个方法而已。你可以通过在对象浏览器中选中“显示隐含成员”清楚地看到这一点。
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