在 VB6 中通过 COM 处理在 .NET 类上公开的事件 [英] Handling events exposed on a .NET class via COM in VB6

查看:13
本文介绍了在 VB6 中通过 COM 处理在 .NET 类上公开的事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 VB6 中通过 COM 处理在 .NET 类上公开的事件

Handling events exposed on a .NET class via COM in VB6

我的测试 .NET(在编译器设置中为互操作注册的类库)代码:

My test .NET (class libary registered for interop in compiler settings) code:

Imports System.Runtime.InteropServices

<InterfaceType(ComInterfaceType.InterfaceIsIDispatch), ComVisible(True)> _
Public Interface MyEventInterface
    <DispId(1)> Event Exploded(ByVal Text As String)
    <DispId(2)> Sub PushRedButton()
End Interface


<ClassInterface(ClassInterfaceType.None)> _
Public Class EventTest
    Implements MyEventInterface

    Public Event Exploded(ByVal Text As String) Implements MyEventInterface.Exploded

    Public Sub PushRedButton() Implements MyEventInterface.PushRedButton

        RaiseEvent Exploded("Bang")

    End Sub

End Class

我的测试VB6应用程序winforms代码(引用了上面的类库):

My test VB6 application winforms code (which references the above class libary):

Public ct As New ComTest1.EventTest

Private Sub Command1_Click()

    ct.add_Exploded (ExplodedHandler)

    ct.PushRedButton

    ct.remove_Exploded (ExplodedHandler)

End Sub

Private Sub ExplodedHandler(ByVal Text As String)

    MsgBox Text

End Sub

特别是我不确定如何在 VB6 中设置处理程序,我得到的编译错误是 VB6 中这一行的Argument not optional":

Specifially I'm not sure how to set up the handler in VB6 the compile error I get is "Argument not optional" on this line in the VB6:

ct.add_Exploded (ExplodedHandler)

推荐答案

使用<ComSourceInterfaces(GetType(接口名称))> 中的事件.NET 和 VB6 中的 WithEvents

Use <ComSourceInterfaces(GetType(the interface name))> for the events in .NET and WithEvents in VB6

.NET 类库:

Imports System.Runtime.InteropServices

' This interface is to expose the events
<Guid("28C7DCE1-90EF-4a30-AF7F-4187F9FFFDEB")> _
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface MathsEvents
    <DispId(1)> _
    Sub Calculated(ByVal Result As Double)
End Interface

' This interface is to expose the properties and methods
<Guid("86CE5E8D-777D-4cd5-8A7D-7F58737F1DB4")> _
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface _Maths
    <DispId(2)> _
    Property ValueA() As Double
    <DispId(3)> _
    Property ValueB() As Double
    <DispId(4)> _
    ReadOnly Property Result() As Double
    <DispId(5)> _
    Sub Add()
End Interface

' This is the actual class
' The events are exposed by using the ComSourceInterfaces attribute
' The properties and methods are exposed using the Implements keyword
<Guid("C58721B1-15B3-4eeb-9E1E-BCDA33D38EE6")> _
<ClassInterface(ClassInterfaceType.None)> _
<ComSourceInterfaces(GetType(MathsEvents))> _
Public Class Maths
    Implements _Maths
    Public Event Calculated(ByVal Result As Double)
    Private mValueA As Double
    Private mValueB As Double
    Private mResult As Double

    Public Property ValueA() As Double Implements _Maths.ValueA
        Get
            Return mValueA
        End Get
        Set(ByVal value As Double)
            mValueA = value
        End Set
    End Property

    Public Property ValueB() As Double Implements _Maths.ValueB
        Get
            Return mValueB
        End Get
        Set(ByVal value As Double)
            mValueB = value
        End Set
    End Property

    Public ReadOnly Property Result() As Double Implements _Maths.Result
        Get
            Return mResult
        End Get

    End Property

    Public Sub New()
        mValueA = 0
        mValueB = 0
        mResult = 0
    End Sub

    Public Sub Add() Implements _Maths.Add
        mResult = mValueA + mValueB
        RaiseEvent Calculated(mResult)
    End Sub

End Class

VB6 测试应用:

Private WithEvents calc As Maths

Private Sub btnAdd_Click()

   calc.ValueA = CDbl(txtValueA.Text)
   calc.ValueB = CDbl(txtValueB.Text)
   calc.Add

End Sub

Private Sub calc_Calculated(ByVal Result As Double)
   txtResult.Text = CStr(Result)
End Sub

Private Sub Form_Load()

   Set calc = New Maths

End Sub

这篇关于在 VB6 中通过 COM 处理在 .NET 类上公开的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆