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'
当我尝试将“ sender As Object”与参数一起给我时出现错误:
“签名与委托人不兼容”
其他问题
我已经根据您给我的指示对互联网进行了研究。
第一: 我已经可以使用包装程序类成功识别发送方设备,我的代码如下所示:
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
答案 0 :(得分: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',因为我认为这会使我的代码更清晰< / p>