Vb6 为什么ByRef不能与事件一起工作?

Vb6 为什么ByRef不能与事件一起工作?,vb6,byref,Vb6,Byref,我想我很清楚VB中的ByVal和ByRef之间的区别,但我的问题是当我尝试将它与声明为WithEvents的成员一起使用时 我有以下方法: Private Sub SafeCloseAndDeRefConnection(ByRef cnx As ADODB.Connection) On Error GoTo ErrH If Not cnx Is Nothing Then If (cnx.State And adStateConnecting) = adStateConne

我想我很清楚VB中的
ByVal
ByRef
之间的区别,但我的问题是当我尝试将它与声明为
WithEvents
的成员一起使用时

我有以下方法:

Private Sub SafeCloseAndDeRefConnection(ByRef cnx As ADODB.Connection)
On Error GoTo ErrH
    If Not cnx Is Nothing Then
        If (cnx.State And adStateConnecting) = adStateConnecting Then
            cnx.Cancel
        End If

        If (cnx.State And adStateOpen) = adStateOpen Then
            cnx.Close
        End If

        Set cnx = Nothing
    End If
Exit Sub
ErrH:
 Set cnx = Nothing
End Sub
如果我有一个类成员被声明为:

Private WithEvents Connection As ADODB.Connection
然后,我想关闭连接,然后将其称为:

SafeCloseAndDeRefConnection Connection
但是在调用
SafeCloseAndDeRefConnection
之后,
Connection
变量没有设置为
Nothing
,并且仍然具有其原始引用

如果我删除
with events
关键字,对
安全关闭和断开连接的调用将按预期工作(但显然无法处理事件)

有人能解释一下为什么会发生这种情况吗

另外,我发现了一个类似的解决方案,但该解决方案在我的场景中不起作用。

也许可以调用:

Set Connection = Nothing
安全关闭和断开连接(连接)


这将强制销毁对象,而不是依赖VB6为您执行此操作

无法传递
WithEvents
对象
ByRef
,如果您尝试传递该对象,则传递“副本”,就像您声明它
ByVal
一样。必须以这种方式来管理连接和断开实际对象的传出事件接口和客户端的接收器对象。尝试实现一个“流畅”函数,然后可以像这样使用
Set Connection=SafeCloseAndDeRefConnection(Connection)
@Bob77谢谢您的回复。这有点道理(只要VB有道理)。您是否有更详细解释这一点的参考资料?VB6是一种“pre-Web 2.0”语言,因此有关这方面的帮助有些分散,在Web上不太容易找到。有关该机制的详细信息是Windows主题,而不是VB6主题。VB6致力于消除理解此类实现细节的需要。您可以尝试“COM和可连接对象中的事件”,尽管这有点违背了该方法最初存在的目的。