用DELPHI编写TAPI应用程序


======================================================
注:本文源代码点此下载
======================================================

tapi(telphony application programminginterface)可以称作电话编程接口,它是微软提供的计算机和电话网相联系的编程接口,使程序员可以利用这个接口通过电话线使用多种计算机复杂的通讯工作。tapi能提供的功能主要有:自动拨号;以文件、传真、电子邮件的方式传送文件;访问internet或其他形式信息服务、组织会议呼叫、使用主叫识别处理入呼叫、计算机间通过电话线的互相协作。这里提到的有的功能很早就已经广泛应用了,还有一些由于我国交换设备不提供此类功能很少问津。这里笔者不想对tapi能实现什么功能多加讨论,只就编程谈一点体会。

促使笔者利用tapi编写程序主要是由于工作中经常需要发传真,而每个传真都需要确认,如果电话是功能最少的那种,每次都要花大量的时间在上面。如果确认时再没人应答,之后再来一次,效率就更低了。因此,笔者想到利用tapi编写一个程序能用modem自动拨号,通话结束后记录一下内容,省了每次辛苦地看着号码拨号。下面将程序与读者共享。

笔者利用delphi作为开发工具,原因主要是delphi开发程序方便快捷,同时数据库的使用比较简单。使用过visualc++的朋友都知道它的帮助是十分详细的,笔者开发的许多程序都参考了其中的win32sdk帮助,尤其是在编写tapi程序时,仔细地研究了其中的tapi部分。使用vc编写tapi程序可以利用现成的“tapi.h”头文件,但使用delphi就需要将c++版本的头文件翻译成objectpascal的格式,再将“tapi32.dll”中的函数引用到头文件中来。幸好这项工作不用我们去做,从inprise公司的站点可以获得delphi关于tapi编程的头文件,省了不少事,笔者的头文件tapi.pas是davidemoretti编写的,如果需要的朋友可以通过报社和笔者联系。

首先介绍程序中用到的几个函数:lineinitialize、linenegotiateapiversion、lineopen、linemakecall、linehandoff、lineshutdown、lineconfigdialog、linecallbackproc、linegeticon。函数的使用过程依次是:lineinitialize初始化线路、linenegotiateapiversion确定tapi版本号、lineopen打开线路、lineconfigdialog显示线路设备属性、linemakecall自动拨出电话号码、

linegeticon获得线路设备图标的句柄、linehandoff将modem控制线路权转到用户、lineshutdown关闭线路。这里所用的函数名和tapi32.dll中输出的函数名相同。

由于delphi和vc中类型定义的区别,笔者有必要举例说明函数定义在vc和delphi中的区别。以lineinitialize为例,在vc中定义为

longlineinitialize(lphlineapp lphlineapp,hinstance hinstance,linecallbacklpfncallback,lpcstr lpszappname,lpdwordlpdwnumdevs)。lphlineapp是线路tapi应用的句柄指针,hinstance是实例指针,lpfncallback指向呼叫返回处理函数,lpszappname指向用户提供的应用程序名字符串,lpdwnumdevs指向可供使用的线路设备个数。在delphi文件tapi.pas中对此函数的定义如下:

functionlineinitialize(var lphlineapp: thlineapp;hinstance: hinst;

lpfncallback:tlinecallback;

lpszappname: pchar;var lpdwnumdevs: longint):longint;

其中我们定义thlineapp、tlinecallback为指向longint的指针(&longint)。其他函数的定义类推,分别用delphi中的相应类型代替,如果是长指针如句柄指针可以用“&longint”来定义。

下面介绍程序的代码部分,在此笔者假定读者具备delphi数据库和一般编程基础。首先用databasedesktop建立两个paradox7表,分别为“workphone.db”和“friendphone.db”。在主form上放置ttable、tdatasource、tdbgrid、tpopupmenu控件。程序定义sappdir:string保存应用程序所在目录,设置sappdir:=getcurrentdir。在弹出式菜单中定义两个过程分别在tdbgrid中载入两个数据库表。

proceduretmainform.friendphoneclick(sender:tobject);

begin

mainform.table1.active:=false;

mainform.table1.tablename:=sappdir+‘friendphone.db’;

mainform.caption:=‘自动拨号——朋友电话’;

mainform.table1.active:=true;

end;

proceduretmainform.selectclassmateclick(sender:tobject);

begin

mainform.table1.active:=false;

mainform.table1.tablename:=sappdir+‘workphone.db’;

mainform.caption:=‘自动拨号——工作电话’;

mainform.table1.active:=true;

end;

将tdbgrid的options属性中的dgediting设为true,允许用户直接修改表中的内容。在弹出菜单中定义dialphone和deleterecord分别用于拨打电话号码和删除当前记录。下面主要介绍拨打电话的tapi应用部分。电话号码是通过mainform.table1.fields.fields[0].asstring作为字符串来传递的。

实现的代码部分如下,其中为了文章不会太长笔者省去了不必要的错误提示和部分代码。

变量定义

lineapp:thlineapp;//tapi应用句柄

line:thline;//线路句柄

call:thcall;//呼叫句柄

callparams:tlinecallparams;//呼叫参数

ndevs,tapiversion,errorcode:longint;//线路设备数、tapi版本号、错误代码

extid:tlineextensionid;//tapi扩展版本号

lineicon:hicon;//线路设备图标

过程定义

procedure linecallback(hdevice, dwmsg, dwcallbackinstance,

dwparam1, dwparam2, dwparam3: longint);//异步呼叫返回处理函数

{$ifdef win32}

stdcall;

{$else}

export;

{$endif}

var

hcall:thcall;

begin

if dwmsg = line_reply then { linemakecall的响应结果}

if dwparam20 then

begin

linedeallocatecall(hcall);

end;

linecallstate_proceeding:{呼叫正常处理}

linecallstate_dialtone:{检测到拨号音}

linecallstate_dialing:{正在拨号}

linecallstate_disconnected:{连接已断开}

begin{断开原因}

ifdwparam2=linedisconnectmode_normal then{正常断开}

else ifdwparam2=linedisconnectmode_busy then {线路忙}

linecallstate_busy:{线路忙处理}

end;

end;

proceduretdialform.(dialnumber:string);//dialnumber为电话号码字符串

begin

withcallparams do {callparams的类型参考vc中的定义,将dword改为longint}

begin

dwtotalsize := sizeof(callparams);

dwbearermode :=linebearermode_voice;//承载模式为语音

dwmediamode:=linemediamode_interactiv

evoice;//媒体模式为交互式语音

end;

if lineinitialize(lineapp,hinstance,linecallback,nil,ndevs)关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值