API调用的事件处理程序

时间:2019-11-13 21:12:29

标签: api events access-vba handler

我们正在使用Zoiper Biz的旧版本,该版本使用的是旧api,而不是当前的zoiper api。我正在尝试在Access vba女士中编写一个处理程序,以便在zoiper响起时,处理程序将提供呼叫者ID,然后该呼叫者ID可用于调用客户详细信息并以表格形式显示。

我遇到的问题是,告诉处理程序侦听API的OnLineStateEvent的更改。我可以使用API​​来从数据库进行调用,也可以使用API​​来应答该调用,但我只是找不到捕获调用方ID的方法。

API文档中与OnLineStateEvent相关的段落如下:

OnLineStateEvent-(行:整数;状态:TLineState;帐户名:字符串; 格式:TCodecs; callerid:字符串; releasecause:整数)-线路状态 当一行更改其状态并提供该行时,将触发事件 状态,用于呼叫的帐户,用于呼叫的格式, 如果新状态为lsDown,则显示callerid和释放原因。

TLineState如下:

TLineState-此枚举类型用于保存行状态常量之一,并且 表示给定行的当前状态。它与信息一起使用 事件,不能设置为一行。

⇒线路状态常量如下: •lsDown-线路上没有呼叫。还指示呼叫已结束。 •lsDialing-线路正在拨号,但仍然没有有意义的状态。 •lsActive-线路处于活动状态,即远端有语音活动 (可能是IVR或某些服务器端响铃),但呼叫不 回答。 •lsRinging-线路上有来电。 •lsWaitForAnswer-拨出电话在远端响铃。 •lsUp-通话已打开,双方都互相听到。这是唯一的 可以转移并保持的呼叫状态。 •lsResolvingPort-解析STUN端口。

我试图编写一个名为Zoiper的类来处理线路状态事件。


Option Explicit
Public Event LineStatus(ByVal state As String, ByVal callerid As String)

Public Ring As String
Public ThisCallerID As String

Public Function MyEventHandler(state, callerid)
    If state = "IsRinging" Then
        ThisCallerID = callerid
    End If
    MyEventHandler = ThisCallerID
    RaiseEvent LineStatus(state, callerid)
End Function

调用函数如下:

Private Sub cmdAnswer_Click()
Stop
Set il = CreateObject("idefisk.IdefiskAPI")
Dim Listener As Zoiper
Set Listener = New Zoiper

With Listener
    .MyEventHandler(state, callerid) = il.OnLineStateEvent(state, callerid)
End With

If Listener.Ring = "IsRinging" Then
    Me.txtCallerNumber = Listener.ThisCallerID
End If

'il.answer 0

End Sub

cmdAnswer_click进入.MyEventHandler(state,callerid)= il.OnLineStateEvent(state,callerid)与对象不支持此属性或方法,我想这与il.OnLineStateEvent(state,callerid)有关)。

il.Answer 0被重新分配,因为我不希望它在解决之前一直不接听电话。

我已经更改了太多的代码行,以至于我忘记了尝试过的内容和未尝试过的内容。 如果有人能指出正确的方向,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我没有使用API​​,也没有安装API,所以这只是一个建议。

尝试围绕Zoiper构建包装器,并听其OnLineStateEvent。然后,如果statelsRinging,则引发包装器事件以更新UI。

重要: 您需要根据api的文档复制TLineState枚举。这些值应该匹配,以便能够比较状态。

在此示例中,我没有定义任何值,因此lsDown等于0,lsDialing等于1等等,但是正如我所说,枚举后面的数字值应与api匹配为了能够进行比较。

TLineState枚举:

Public Enum TLineState
    lsDown
    lsDialing
    lsActive
    lsRinging
    lsWaitForAnswer
    lsUp
    lsResolvingPort
End Enum

我们的包装器类。

Option Explicit
Public Event RingingEvent(ByVal calledId As Long)

Private WithEvents objZoiper As Zoiper

' Zoiper OnLineStateEvent.
' Listen to it and raise our RingingEvent if the state is 'lsRinging'
Private Sub objZoiper_OnLineStateEvent(ByVal state As TLineState, ByVal callerid As Long)
    If state = TLineState.lsRinging Then
        RaiseEvent RingingEvent(callerid)
    End If
End Sub

Private Sub Class_Initialize()
    Set objZoiper = New Zoiper
End Sub
Private Sub Class_Terminate()
    Set objZoiper = Nothing
End Sub

包装器类所驻留的表单。

在窗体加载时创建包装类的实例,并在关闭时销毁它。您可以根据需要更改该行为。

Option Explicit
Private WithEvents objWrapper As ZoiperWrapper

Private Sub Form_Load()
    Set objWrapper = New ZoiperWrapper
End Sub

Private Sub Form_Close()
    Set objWrapper = Nothing
End Sub

Private Sub objWrapper_RingingEvent(ByVal calledId As Long)
    txtCallerNumber.Value = calledId
End Sub