基 于Win95 TAPI 的 调 制 解 调 器 编 程

上传人:s9****2 文档编号:494785110 上传时间:2022-08-02 格式:DOCX 页数:7 大小:13.82KB
返回 下载 相关 举报
基 于Win95 TAPI 的 调 制 解 调 器 编 程_第1页
第1页 / 共7页
基 于Win95 TAPI 的 调 制 解 调 器 编 程_第2页
第2页 / 共7页
基 于Win95 TAPI 的 调 制 解 调 器 编 程_第3页
第3页 / 共7页
基 于Win95 TAPI 的 调 制 解 调 器 编 程_第4页
第4页 / 共7页
基 于Win95 TAPI 的 调 制 解 调 器 编 程_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《基 于Win95 TAPI 的 调 制 解 调 器 编 程》由会员分享,可在线阅读,更多相关《基 于Win95 TAPI 的 调 制 解 调 器 编 程(7页珍藏版)》请在金锄头文库上搜索。

1、基于Win95 TAPI的调制解调器编程一、简介:-随着Win95操作系统的普及,计算机之间的通信已经 成为大多数应用程序开发的要求,这其中的主要原因 是Win95不仅仅能够支持大多数硬件,而且为硬件的操作 提供了方便的编程接口(API),Win95的应用程序接口(API) 提供的通信手段大致分为以下几类:1基于TCP/IP协议 的Winsock API,可实现局域网上或互联网上的微机通信; 2基于进程之间的通信技术:动态数据交换(D D E); 3基于直接电缆连接的通信技术,可直接操作串行口、 并行口以及远红外线接口; 4基于电话线路的通信应用 程序接口(TAP I /Telephony A

2、PI),可方便地控制调制解 调器;从目前的发展状况看来,调制解调器已经成为远 距离通信的一种重要工具,为此Microsoft及Intel公司联 合开发了 TAPI这样一个编程接口,而且,使用API函数编制 的程序段既适用于Borland C+编译器,同时也能插入Visual C+程序中编译运行,作为Win95的应用程序编制人员,学会 使用TAPI编程操作调制解调器通过电话线路进行通信这一技术是很有必要的。下面就TAPI编程进行讨论:二、通信过程描述1初始化线路(通信双方都应该初始化线路)通过使用lineInitialize函数初始化TAPI.DLL得到TAPI使 用句柄的指针hTapi,请注意

3、参数中回调函数的定义(所有提及 函数的用法均可从BC+5.0及Visual C+5.0的帮助中获得);通过 调用lineOpen函数(用到参数hTapi)获得线路句柄hLine;再利用 lineGetID(用到参数hLine)获取调制解调器句柄hModem-2配置线路(可选)调用SetCommConfig(用到hModem)改变调制解调器的设置-3拨号(由呼叫方执行)-使用lineMakeCall函数(用 到hLine)进行 拨号,完 成后获 得呼叫句柄hCall (呼叫方的呼叫句柄)-4应答链接(由被呼叫方执行)被呼叫的一方的回调函数得到LINECALLSTATE_OFFERING消 息时,

4、调用lineAnswer函数实现自动应答(呼叫句柄hCall由回调 函数的参数给出)-5数据通信(双方)当回调函数收到LINECALLSTATE_CONNECTED消息后,请先清 除接收缓冲区,可以使用函数为WriteFile及ReadFile函数进行数 据交换,注意参数hFile为调制解调器句柄hModem6挂机(某一方)-通信完毕任何一方都可以调用函数lineDrop(hCall,NULL,0)来停止呼叫,该函数还发送LINECALLSTATE_IDLE消息给回调函 数 7关闭线路(双方)通信双方的回调函数在收到LINECALLSTATE_IDLE消息时 都应该调用函 数lineDeall

5、ocateCall(hCall)释放相 应呼叫 占 用的资 源;当回调函数收到LINECALLSTATE_DISCONNECTED消息时请使用 lineClose(hLine)释放由lineOpen分配的资源,调用lineShutDown(hTapi)释放为 线路设备分配的资源 三、软硬件环境-下图示意出了我们的应用程序所处的位置 以及涉及到的软硬件环境:-我们的通信应用程序通过TAPI操作Modem拨号、应答、 链接、挂机控制电话呼叫,在编制DOS应用程序的时候,我们经 常使用Hayes兼容的AT命令集来完成这些操作,由于各调制解 调器厂家对该命令集都做了各自的扩展,因而,我们的DOS应用

6、程序一般只能操作一小部分调制解调器,而各厂家都提供Windows 驱动程序,所以,使用TAPI编制的应用程序能够操作绝大多 数调制解调器;图中的通信API是应用程序发送、接收数据的编程 接口。四、程序流程结构框图-由于Win95为多任务操作系统,我们的流程图只能代 表本应用程序的执行先后关系,程序中的等待及检测实际 上是等待Win95提供的消息,所以并不占用CPU时间,在下面的 程序中可以看出。另外,数据交换的协议可由自己制定,也可 使用已有的协议。五、软件编制由于Windows编程的框架基本相同,在此我们只介绍涉及到通信的一部分源程序:-1头文件中应该包括:#include请注意工程文件的属

7、性应该是Windows 32位应用程序-2通信所涉及到的一些全局变量定义及类型定义:char RecBuf20, buf20/ 缓冲区DWORD Error; / 错误码COMSTAT Status; / 状 态 码DWORD NumLine;/允许使用的线路设备数LINECALLPARAMS para;/ 呼叫参数TmyDecFrame * pwin=NULL;/ 主窗 口指针HLINEAPP myhTapi;/线路应用程序句柄HLINE myhLine;/ 线 路句柄HANDLE myhModem;/调制解调器句柄HCALL myhCall;/ 呼叫句柄typedefstructtagMo

8、demID(HANDLE hModem;charModemName1;ModemID;3下面为获取调制解调器句柄的函数定义因为每个调制解调器的标志字符串长度不一,所以 函数中用到了可变长度的字符串,处理方法是先为字符串指 针分配sizeof(VARSTRING)大小的空间,再利用该空间容纳调用 LineGetID时Windows返回的信息,根据返回信息判断所需空间大小 重新分配空间,再次调用LineGetID就可以取得完整的标志字符 串。voidGethModem(HLINE hLine)( ModemID far *mid;VARSTRING * str;LONG lid;DWORD siz

9、e;char mark=1;str=(VARSTRING *)malloc(sizeof(VARSTRING);if(!str) return NULL;str-dwTotalSize二sizeof(VARSTRING);do(if(lineGetID(myhLine,0,NULL,LINECALLSELECT_LINE,str,comm/datamodem)=0)&(str- dwTotalSizedwNeededSize)( dwSize=str- dwNeededSize;free(str);str=(VARSTRING *)malloc(dwSize);if(!str)( myhMod

10、em=NULL;mark=2; str-dwTotalSize二dwSize;else mark=0;while(mark=1);if(mark=0)( mid=(ModemID far*)(LPSTR)str+str- dwStringOffset);myhModem=mid- hModem; free(str);-4在主窗口初始化函数中加入对线路的初始化过 程:pwin二this;/获得主窗口指针 while(lineInitialize(&myhTAPI,GetModule()- GetInstance(),(LINECALLBACK)MakeProcInstance(FARPROC)

11、lpfnCallback,GetModule()- GetInstance(), TRY,&NumLine )=LINEERR_REINIT) (sleep(1);/ 延迟 ;Error=lineOpen(hTAPI,0,&HLine,0x10004,0,0,LINECALLPRIVILEGE_M ONITOR+LINECALLPRIVILEGE_OWNER,LINEMEDIAMODE_DATAMODEM,NULL);if(Error!=0)( sprintf(buf,lx,Error);MessageBox(buf,0,MB_OK); else( GethModem(myhLine);/ 取

12、得 myhModem 的值 if(myhModem!=NULL) (para.dwBearerMode=LINEBEARERMODE_VOICE;para.dwMediaMode=LINEMEDIAMODE_DATAMODEM;para.dwTotalSize=sizeof(LINECALLPARAMS);Error=lineMakeCall(myhLine,&myhCall,8880751,0,?); If(Error!=0)( sprintf(buf,%lx,Error);MessageBox(buf,0,MB_OK);-5呼叫方回调函数的定义void far pascalTMyDecFr

13、ame:lpfnCallback(DWORD hDevice, DWORD dwMsg,DWORD dwCallbackInstance,DWORD dwParam1, DWORD dwParam2,DWORD dwParam3)/参数定义同lineCallbackFunc函数中的参数定义( intRec_num=0;switch(dwParam1)( case LINECALLSTATE_CONNECTED: DWORD len;ClearCommError(myhModem,&Error,&Status);Rec_num=Status.cbInQue;ReadFile(myhModem,R

14、ecBuf,Rec_num,&len,0);至此已经为数据通信做好了前期准备,可设立标志WriteFile(myhModem,Success,7,&len,0);ReadFile(myhModem,RecBuf,8,&len,0);pwin-MessageBox(RecBuf,0,MB_OK);break;case LINECALLSTATE_IDLE:lineDeallocateCall(myhCall);break;case LINECALLSTATE_DISCONNECTED:lineClose(myhLine);lineShutDown(myhTapi);break;6被叫方回调函数的

15、定义void far pascalTMyDecFrame:lpfnCallback(DWORD hDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORDdwParam2, DWORD dwParam3)( intRec_num=0;switch(dwParam3)( case LINECALLPRIVILEGE_OWNER:myhCall=(HCALL)hDevice;Break;/只有对呼叫具有私有特权的调用者才能应答呼叫, 在此获得呼叫句柄switch(dwParam1)( case LINECALLSTATE_CONNECTED:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号