固定电话呼叫挂断的例外情况

时间:2014-06-19 16:18:05

标签: c# tapi

我正在使用C#和TAPI 3库为固定电话和全双工语音调制解调器开发软件。呼叫应答工作正常,但呼叫挂断正在抛出异常。我做了很多搜索以找到解决方案,但我做不到。以下是错误:

  

调用方法ici.ReleaseUserUserInfo();   {"此实现不提供建议(来自HRESULT的异常:   0x80040003(OLE_E_ADVISENOTSUPPORTED))"} System.Exception   {System.Runtime.InteropServices.COMException}"

我的目标是保存录制的来电。一个有趣的事情是,如果在呼叫挂断之前关闭应用程序,它会成功保存录制的呼叫。

我的代码:

private void BtnAnswer_Click(object sender, EventArgs e)
{
    IEnumCall ec = ia[line].EnumerateCalls();
    uint arg = 0;
    ITCallInfo ici;
    ITTerminal recordTerminal;//NY test record
    try
    {
        ec.Next(1, out ici, ref arg);
        ITBasicCallControl2 bc = (TAPI3Lib.ITBasicCallControl2)ici;
        recordTerminal =    bc.RequestTerminal(TapiConstants.CLSID_String_FileRecordingTerminal,
        TapiConstants.TAPIMEDIATYPE_MULTITRACK,
        TAPI3Lib.TERMINAL_DIRECTION.TD_RENDER);
        ITMediaControl mediacontrol = (ITMediaControl)recordTerminal;
        ITMediaRecord mediarecord = (ITMediaRecord)recordTerminal;
        mediarecord.FileName = "a.wav";
        bc.SelectTerminalOnCall(recordTerminal);
        bc.Answer();
        mediacontrol.Start();
    }
    catch (Exception exp)
    {
        MessageBox.Show("There may not be any calls to answer! \n\n" + exp.ToString(), "TAPI3");
    }
}

private void BtnHang_Click(object sender, EventArgs e)
{
    IEnumCall ec = ia[line].EnumerateCalls();
    uint arg = 0;
    ITCallInfo ici;
    try
    {
        ec.Next(1, out ici, ref arg);
        ITBasicCallControl bc = (ITBasicCallControl)ici;
        bc.Disconnect(DISCONNECT_CODE.DC_NORMAL);

        ici.ReleaseUserUserInfo();
    }
    catch (Exception exp)
    {
        MessageBox.Show("No call to disconnect!", "TAPI3");
    }
}

1 个答案:

答案 0 :(得分:0)

我相信您看到的错误代码实际上是TAPI_E_NOTSUPPORTED!

根据ITCallInfo::ReleaseUserUserInfo的MSDN文档:

  

ReleaseUserUserInfo方法通知服务提供者应用程序已处理从ITCallInfo :: GetCallInfoBuffer方法获得的用户用户信息,该方法使用CALLINFO_BUFFER的CIB_USERUSERINFO成员调用,现在可以写入随后收到的用户用户信息。 / p>

但是,User-user information特定于ISDN Q.931标准,并非所有服务提供商都支持它。

除非您特别想在客户端和远程端之间交换此信息,否则只需删除有问题的代码行就足够了,因为否则它们都是未使用的和不受支持的。