【问题标题】:Invalid use of AddressOf operator VB6AddressOf 运算符 VB6 的无效使用
【发布时间】:2019-08-28 11:41:39
【问题描述】:

我在这里的第一篇文章。

我有用于扫描仪的 c# .dll。 我打算将它与一些旧版 vb6 应用程序一起使用。

.dll 使用 RaiseArgs 使用扫描的代码引发事件。

我正在尝试编写一个用于 VB6 应用程序的 .ocx 库。

为了在 .ocx 库中捕获此事件,我正在尝试修改此代码:

Sub TestEvents()
    Dim Obj As New Class1
    ' Associate an event handler with an event.
    AddHandler Obj.Ev_Event, AddressOf EventHandler
    ' Call the method to raise the event.
    Obj.CauseSomeEvent()
    ' Stop handling events.
    RemoveHandler Obj.Ev_Event, AddressOf EventHandler
    ' This event will not be handled.
    Obj.CauseSomeEvent()
End Sub

Sub EventHandler()
    ' Handle the event.
    MsgBox("EventHandler caught event.")
End Sub

Public Class Class1
    ' Declare an event.
    Public Event Ev_Event()
    Sub CauseSomeEvent()
        ' Raise an event.
        RaiseEvent Ev_Event()
    End Sub
End Class

但我得到了 调用时AddressOf操作符错误使用无效:AddHandler Obj.Ev_Event, AddressOf EventHandler

此错误的可能原因是什么?

我怀疑,我在解决这个任务方面没有朝着正确的方向前进,那么这是解决这个问题的更好方法吗?

【问题讨论】:

  • VB6中没有AddHandler。你在使用 VB.NET 吗?
  • 嗨!我正在使用 vb6,但似乎我错过了,我只能在 .net 中使用 AddHandler ......你能给我指出如何解决我原来的问题的方向:让事件进入 vb6 吗?
  • 如果您已经有一个带有 VB 识别事件的 COM 可见 DLL,请像往常一样声明一个事件处理程序,以 Private Sub ObjectName_EventName() 的形式。否则请参阅stackoverflow.com/q/39511528/11683

标签: vb6


【解决方案1】:

我认为您混合了 VB6 和 VB.NET。在 VB6 中,如果您想为您自己创建的对象添加事件处理程序(而不是使用表单设计器添加),您可以这样做:

Private WithEvents mObjectThatHasEvents As Class1

Private Sub StartListeningToEvents()

   If mObjectThatHasEvents Is Nothing Then
      Set mObjectThatHasEvents = New Class1
   End If

End Sub

Private Sub TriggerEvent()
   mObjectThatHasEvents.CauseSomeEvent
End Sub

'Assumes that Class1 has an event called "MyEvent".  
Private Sub mObjectThatHasEvents_MyEvent()
   MsgBox("EventHandler caught event.")
End Sub

Private Sub StopListeningToEvents()
   Set mObjectThatHasEvents = Nothing
End Sub

如果您需要在不监听其事件的同时保持事件源对象处于活动状态,则需要通过非“WithEvents”的变量对其进行第二次引用。

我应该指出,VB6 IDE 将识别事件源。在代码窗格中,使用顶部的下拉菜单选择对象和事件。 IDE 会自动为您将它们存根(就像按钮或其他任何东西一样)。

【讨论】:

    【解决方案2】:

    tcarvin 几乎解释了您必须做什么,但这是您的代码,已调整:

    Private WithEvents mObjWithEvents As Class1
    
    Sub TestEvents()
        Dim Obj As New Class1
    
        Set mObjWithEvents = Obj
    
        ' Call the method to raise the event.
        Obj.CauseSomeEvent
    
        ' Stop handling events.
        Set mObjWithEvents = Nothing
    
        ' This event will not be handled.
        Obj.CauseSomeEvent
    
    End Sub
    
    Private Sub mObjWithEvents_EvEvent()
        ' Handle the event.
        MsgBox ("EventHandler caught event.")
    End Sub
    

    还有你的 Class1:

    Public Event EvEvent()
    
    Public Sub CauseSomeEvent()
        ' Raise an event.
        RaiseEvent EvEvent
    End Sub
    

    请注意,Ev_Event 已重命名为 EvEvent。

    【讨论】:

    • 嗨!我想确认一下,代码有效。问题实际上出在配置错误的 GUID 中。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多