辅助电话概述

电话的一个有价值的功能是一组称为“辅助电话”的函数。 辅助电话旨在使语音呼叫和媒体呼叫的建立可用于任何应用程序,而不仅仅是那些专用于电话功能的应用程序。 换句话说,辅助电话允许应用程序拨打电话,而无需了解完整电话 API 的服务详细信息。 它将电话扩展到字处理应用程序、电子表格、数据库、个人信息管理器和其他非电话应用程序。

有关基本电话的 TAPI 2.x 辅助电话功能的列表,请参阅 TAPI 快速函数参考。 TAPI 3.x 通过 ITRequest 接口支持辅助电话。

以下示例说明了辅助电话的有用性。 电子表格应用程序可以合并用于拨打电话号码进行语音呼叫的函数。 只要应用程序不需要完整电话 API 提供的详细呼叫控制,辅助电话就是为其提供电话功能的最简单、最有效的方法。

使用电子表格应用程序进行辅助电话

辅助电话和完整的电话 API 以不同的方式使用和实现,因此不建议在单个应用程序中混合使用辅助电话函数调用和电话 API 函数调用。

使用辅助电话

使用辅助电话服务的应用程序仅启动由 TAPI 临时排队的呼叫请求。 请求接收方应用程序检索这些请求,并代表协助电话应用程序执行这些请求。 tapiRequestMakeCall 函数请求建立语音呼叫。 请求应用程序不控制调用。

TAPI 允许用户为每个服务建立不同或相同的请求收件人应用程序。 应用程序通过向 lineRegisterRequestRecipient 注册成为请求接收者,其中 TRUE 指定为参数 bEnable 的值。 (指定 FALSE 将应用程序注销为请求接收者,当应用程序确定其接收方职责为当前会话时,应执行该操作。) 应用程序在 lineRegisterRequestRecipientdwRequestMode 参数中选择要处理的服务。 请求的可能值为 LINEREQUESTMODE_MAKECALL,以显示应用程序将处理 tapiRequestMakeCall 请求。 如果多个应用程序注册相同的服务,则使用优先级方案允许用户选择处理请求的首选应用程序。 此优先级方案与用于呼叫切换和基于注册表中 HandoffPriorities 中的文件名列表路由传入呼叫的方案相同。

呼叫请求

辅助电话为支持电话的应用程序提供了一种易于使用的机制来拨打电话,而无需开发人员完全熟悉电话。

tapiRequestMakeCall 函数请求用户与其电话号码指定的远程方之间的语音呼叫。 请求是向 TAPI 发出的,TAPI 会将其传递给注册为此类请求接收方的应用程序。 此收件人是呼叫管理器应用程序。

应用程序发出请求后,呼叫完全由呼叫管理器应用程序控制,因为辅助电话应用程序无法管理呼叫。 由于电话和所有用户界面操作的更复杂的方面都由呼叫管理器应用程序处理,因此无需以任何实质性方式修改已启用电话的应用程序。 事实上,允许从其内置脚本语言调用此操作的应用程序可能根本不需要修改。

tapiGetLocationInfo 函数将国家或地区代码和城市 (区域) 用户在电话控制面板的当前位置参数中设置的代码返回到应用程序。 应用程序可以使用此信息来帮助用户形成正确的规范电话号码,例如,在电话簿条目或数据库记录中输入新号码时,将其作为默认值提供。

请求收件人

运行辅助电话需要两种类型的应用程序。 辅助电话 客户端 是通过调用前缀为“tapi”的函数来使用辅助电话的应用程序。此类客户端应用程序的一个示例是一个电子表格,其中添加了 “拨号 ”菜单命令或工具栏按钮。

辅助电话 服务器 是可以执行电话 API 函数的应用程序,这些函数由另一个应用程序调用“tapi”前缀函数而产生。 为了使自己成为辅助电话服务器,此类应用程序使用 lineRegisterRequestRecipient 函数注册为一个。

以前缀“tapi”) 开头的辅助电话 (函数称为 请求函数。 处理这些请求的辅助电话应用程序(辅助电话服务器)称为 请求收件人

处理辅助电话请求

传递和处理请求的过程如下:

  1. 当 TAPI 收到协助电话请求时,它会检查请求收件人,即当前注册用于处理该类型请求的应用程序。 如果有请求收件人,则请求将排队,并且为该请求的服务注册的最高优先级应用程序将发送 LINE_REQUEST 消息。 该消息通知请求收件人新请求已到达,并指示请求的模式。

  2. 如果 TAPI 找不到当前正在运行的应用程序来处理此类请求,它会尝试启动已注册为能够这样做的应用程序。 此注册信息记录在注册表中的 HandoffPriorities 中。 TAPI 尝试按 HandoffPriorities 部分中列出的顺序启动应用程序。 (请参阅以下步骤。)

    如果当前未注册任何应用程序,TAPI 将检查 HandoffPriorities 中关联条目上的请求处理应用程序列表。 如果文件中缺少关联的行、未列出任何应用程序,或者列表中任何应用程序都无法启动,则拒绝请求并显示错误TAPIERR_NOREQUESTRECIPIENT。

    启动请求收件人 (是否由 TAPI 启动) 它的责任是在启动过程中调用 lineRegisterRequestRecipient 并将自己注册为请求接收者。

  3. 如果条目中列出了一个或多个应用程序,TAPI 从列出的第一个应用程序开始 (最高优先级) ,并尝试使用 CreateProcess 函数启动它。 如果尝试启动应用程序失败,TAPI 会尝试启动列表中的下一个应用程序。 当任何应用程序成功启动时,TAPI 只需将请求排队,并将成功指示返回给应用程序,即使请求尚未向请求接收方发出信号。

    启动请求接收方应用程序后,它会调用 lineRegisterRequestRecipient,这会导致发送 LINE_REQUEST 消息,并指示请求已排队。 如果由于某种原因启动的应用程序从未注册,则请求将保持排队状态,并无限期地保留在队列中,直到应用程序注册该类型的请求。

  4. 如果 TAPI 发现此类已注册的应用程序已在运行或成功启动应用程序,则会将请求排队,向服务器应用程序发送LINE_REQUEST消息,并返回对辅助电话应用程序的函数调用成功指示。 此成功消息仅指示请求已被接受并排队,而不是已成功执行请求。

当服务器应用程序准备好处理请求时,它会调用 lineGetRequest 函数。 这样,它就可以接收所需的任何信息,例如要拨号的地址。 然后,它使用 TAPI 函数 (处理请求,例如 lineMakeCalllineDrop) ,否则将用于发出调用。 调用 lineGetRequest 会从 TAPI 中删除请求,并将请求参数复制到应用程序分配的请求缓冲区中。 缓冲区内容的大小和解释取决于请求模式。

服务器必须确保在执行请求时使用正确的参数。 执行此操作时,请遵循以下步骤:

  1. 请求接收者首先收到一条 LINE_REQUEST 消息,通知其请求可以在请求队列中存在。 这会告知应用程序调用 lineGetRequest ,并一直调用它,直到队列被排空, (请求是否要进行新的调用) ,或删除现有调用。 此消息不包含请求的参数,但请求删除现有调用的情况除外。
  2. 如果请求要进行新呼叫,则辅助电话服务器使用 lineGetRequest 函数检索完整请求,其中包括请求的参数。 服务器现在具有它所需的所有信息,例如要拨打的号码或请求的制造商的标识。 但是,首先,服务器必须分配存储此信息所需的内存。
  3. 最后,服务器通过调用相应的 TAPI 函数或函数集来执行请求。

如果 TAPI 无法启动能够充当请求接收方的应用程序,则辅助电话呼叫将失败,TAPIERR_NOREQUESTRECIPIENT返回错误。

有关请求收件人操作的说明

以下信息涉及处理辅助电话请求的系统:

  • 默认注册表应在 tapiRequestMakeCall 的优先级列表中列出调用管理器应用程序。 对于调用管理器应用程序来说,有一个允许用户将其设置为最高优先级的菜单选项是有帮助的,但并非必要。
  • 当 TAPI 自动启动辅助电话收件人应用程序时,如果它是系统中唯一的 TAPI 应用程序,则此操作将初始化 TAPI。 如果辅助电话接收者应用程序在注册辅助电话请求之前初始化并关闭线路设备,TAPI 也会关闭,并且辅助电话请求将丢失。 当启动的另一个 TAPI 应用程序执行初始化和关闭时,辅助电话请求也可能丢失。