-1
Public axCZKEM1,axCZKEM2 As New zkemkeeper.CZKEM


AddHandler axCZKEM1.OnAttTransactionEx, AddressOf Ax_OnAttTransactionEx
AddHandler axCZKEM2.OnAttTransactionEx, AddressOf Ax_OnAttTransactionEx




Private Sub Ax_OnAttTransactionEx(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, _
                  ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer)

    lbRTShow.Items.Add("RTEvent OnAttTrasactionEx Has been Triggered,Verified OK")
    lbRTShow.Items.Add("...UserID:" & sEnrollNumber)
    lbRTShow.Items.Add("...isInvalid:" & iIsInValid.ToString())
    lbRTShow.Items.Add("...attState:" & iAttState.ToString())
    lbRTShow.Items.Add("...VerifyMethod:" & iVerifyMethod.ToString())

End Sub

此代码用于实时触发指纹设备'

第一个问题

我如何知道哪个设备触发了此事件:此设备“axCZKEM1”或“axCZKEM2”

当我尝试将“发件人作为对象”与参数一起给我错误:

“没有与委托兼容的签名”

额外的关注

我根据您给我的指示研究了互联网。

第一:我已经成功使用包装类识别发件人设备,我的代码如下所示:

Imports zkemkeeper
Imports System
Imports System.Collections.Generic
Public Class myzkem
    Public Property Name
    Private WithEvents CZKEM As zkemkeeper.CZKEM
    Public Event AttEventWrapper(SenderName As String, sEnrollNumber As String, iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer, iDay As Integer, iHour As Integer, iMinute As Integer, iSecond As Integer, iWorkcode As Integer)
    Public Shared ListOfDevices As New Dictionary(Of String, zkemkeeper.CZKEM)

    Public Sub New(WrapperName As String, CZKEMObject As zkemkeeper.CZKEM)
        Me.Name = WrapperName
        Me.CZKEM = CZKEMObject

    End Sub

    Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer) Handles CZKEM.OnAttTransactionEx
        RaiseEvent AttEventWrapper(Me.Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay, iHour, iMinute, iSecond, iWorkCode)
    End Sub
End Class

注意:这是我插入共享字典 [ListOfDevices] 的类。

第二:我用包含我的 CZKEM 对象的函数创建了另一个类,添加和删除处理程序代码和连接代码。

Imports zkemkeeper
Public Class ZKEMKEEPERClass
    Public CZKEM2 As New zkemkeeper.CZKEM
    Public NewKEM As myzkem
    Public Function ZKEMAddHandler(iDevice As String, iIP As String, iPort As Integer) As Boolean
        If CZKEM2.Connect_Net(iIP, 4370) Then
            If CZKEM2.RegEvent(1, 65535) = True Then
                NewKEM = New myzkem(iDevice, CZKEM2)
                AddHandler NewKEM.AttEventWrapper, AddressOf LoginEvent_1

                MsgBox(iDevice)
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If

    End Function
    Public Function ZKEMRemoveHandler(iDevice As String, CZKEM As zkemkeeper.CZKEM)
        NewKEM = New myzkem(iDevice, CZKEM)
        RemoveHandler NewKEM.AttEventWrapper, AddressOf LoginEvent_1
        MsgBox(iDevice)
    End Function

    Public Sub LoginEvent_1(ByVal SenderName As String, ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer)
        MsgBox(SenderName)
    End Sub
End Class

第三:在我的主程序中,我复制 [ZKEMKEEPERClass] 以创建多个同时处于活动状态的对象。

    Sub CONNECT()
        Dim iIP As String
        Dim iDevice As String
        For x = 1 To 2
            Select Case x
                Case 1
                    iIP = "122.3.47.43"
                    iDevice = "Device 1"
                Case 2
                    iIP = "192.168.10.201"
                    iDevice = "Device 2"
            End Select
            Dim NewConnect As New ZKEMKEEPERClass
            If NewConnect.ZKEMAddHandler(iDevice, iIP, 4370) Then
                MsgBox("success")
            Else
                MsgBox("failed")
            End If
        Next

    End Sub

我的新问题:我无法删除处理程序,因为我无法从复制的类中识别它。

让我知道你的想法。

@AConfusedSimpleton

4

1 回答 1

0

我不熟悉这个特定的图书馆,但这是我的 2 美分:

你得到一个不兼容的签名,因为在 zkemkeeper.CZKEM 中定义的事件看起来像这样:

Public event Ax_OnAttTransactionEx(sEnrollNumber As String, iIsInValid As Integer,_ 
    iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer,_ 
    iDay As Integer)

没有定义参数'sender',因此如果你将它添加到你的处理程序,你将有一个不兼容的签名。

了解哪个设备引发事件的一种可能方法是定义您自己的具有属性“名称”(或您想调用的任何名称)的包装类,并定义如下事件:

Public event MyWrapperEvent(SenderName As String, sEnrollNumber As String,_
    iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer,_
    iYear As Integer, iMonth As Integer, iDay As Integer)

然后,您的包装类将保存对 zkemkeeper.CZKEM 对象的引用

Private WithEvents MyCZKEMObject As zkemkeeper.CZKEM

它会在内部处理它的 Ax_OnAttTransactionEx 事件,只需引发它自己的事件,这与添加了“senderName”的事件完全相同。然后它的处理程序看起来像:

Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer,_ 
     ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer,_ 
     ByVal iMonth As Integer, ByVal iDay As Integer) handles MyCZKEMObject.OnAttTransactionEx

    RaiseEvent MyWrapperEvent(Me.Name, sEnrollNumber, iIsInvalid, iAttState, iVerifyMethod, iYear, iMonth, iDay)

End Sub

然后在主程序中,您可以创建包装类的对象并处理它的“MyWrapperEvent”事件。通过检查“senderName”属性,您将知道是哪个设备引发了它。(当然假设你给每个设备一个唯一的名字)

更新:

您的完整包装类实现可能如下所示:

Public Class MyWrapperClass
    Public Property Name
    Private WithEvents MyCZKEMObject As zkemkeeper.CZKEM

    Public Event MyWrapperEvent(SenderName As String, sEnrollNumber As  String, iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer, iDay As Integer)


    Public Sub New(WrapperName As String, CZKEMObject As Zkemkeeper.CZKEM)
        Me.Name = WrapperName
        Me.MyCZKEMObject = CZKEMObject
    End Sub

    Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer) Handles MyCZKEMObject.OnAttTransactionEx

        RaiseEvent MyWrapperEvent(Me.Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay)

    End Sub


End Class

“名称”只是在您的包装类中声明的一个属性,您可以使用它来标识您传递给它的 zkemkeeper.CZKEM 对象。当您的包装类处理此对象的“Ax_OnAttTransactionEx”事件时。它只是引发了它自己的、非常相似的事件,但也传递了它的“名称”属性,您可以使用它来识别设备。

注意:传递 'Name' 而不是 'Me.Name' 效果很好,使用关键字 'me' 只是我个人的偏好,因为我认为它可以让我的代码更清晰

于 2019-04-24T11:36:10.123 回答