Я не знаком с этой конкретной библиотекой, но вот мои 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)
Не определен аргумент «отправитель», и, таким образом, если вы добавите его в свой обработчик, у вас будет несовместимая подпись.
Один из возможных способов узнать, какое устройство вызвало событие, состоит в определении вашегособственный класс-обертка, который имеет свойство name (или как вы хотите его называть) и определяет событие, например:
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
'Name' - это просто свойство, объявленное в вашем классе-обёртке, которое вы используете для идентификации объекта zkemkeeper.CZKEM, который вы ему передаете.Когда ваш класс-оболочка обрабатывает событие Ax_OnAttTransactionEx этого объекта.Он просто вызывает свое собственное, очень похожее событие, но также передает свое свойство Name, которое вы можете использовать для идентификации устройства.
Примечание: Передача «Name» вместо «Me.Name» работает отлично, я просто предпочитаю использовать ключевое слово «me», так как я думаю, что он сохраняет мой код болееясно