Win98下TAPI的數據機程式設計

2021-03-31 12:31:47 字數 3885 閱讀 7365

一、簡介:

隨著win98作業系統的普及,計算機之間的通訊已經成為大多數應用程式開發的要求,這其中的主要原因是win98不僅僅能夠支援大多數硬體,而且為硬體的操作提供了方便的程式設計介面(api),win98的應用程式介面(api)提供的通訊手段大致分為以下幾類:1基於tcp/ip協議的winsockapi,可實現區域網上或網際網路上的微機通訊;2基於程序之間的通訊技術:動態資料交換(dde);3基於直接電纜連線的通訊技術,可直接操作序列口、並行口以及遠紅外線介面;4基於**線路的通訊應用程式介面(tapi/telephonyapi),可方便地控制數據機;從目前的發展狀況看來,數據機已經成為遠距離通訊的一種重要工具,為此microsoft及intel公司聯合開發了tapi這樣乙個程式設計介面,而且,使用api函式編制的程式段既適用於borlandc++編譯器,同時也能插入visualc++程式中編譯執行,作為win98的應用程式編制人員,學會使用tapi程式設計操作數據機通過**線路進行通訊這一技術是很有必要的。下面就tapi程式設計進行討論:

二、通訊過程描述

1初始化線路(通訊雙方都應該初始化線路)

通過使用lineinitialize函式初始化tapi.dll得到tapi使用控制代碼的指標htapi,請注意引數中**函式的定義(所有提及函式的用法均可從bc++5.0及visualc++5.0的幫助中獲得);通過呼叫lineopen函式(用到引數htapi)獲得線路控制代碼hline;再利用linegetid(用到引數hline)獲取數據機控制代碼hmodem

2配置線路(可選)

呼叫set***mconfig(用到hmodem)改變數據機的設定

3撥號(由呼叫方執行)

使用linemakecall函式(用到hline)進行撥號,完成後獲得呼叫控制代碼hcall(呼叫方的呼叫控制代碼)

4應答鏈結(由被呼叫方執行)

被呼叫的一方的**函式得到linecallstate_offering訊息時,呼叫lineanswer函式實現自動應答(呼叫控制代碼hcall由**函式的引數給出)

5資料通訊(雙方)

當**函式收到linecallstate_connected訊息後,請先清除接收緩衝區,可以使用函式為writefile及readfile函式進行資料交換,注意引數hfile為數據機控制代碼hmodem

6掛機(某一方)

通訊完畢任何一方都可以呼叫函式linedrop(hcall,null,0)來停止呼叫,該函式還傳送linecallstate_idle訊息給**函式

7關閉線路(雙方)

通訊雙方的**函式在收到linecallstate_idle訊息時都應該呼叫函式linedeallocatecall(hcall)釋放相應呼叫占用的資源;當**函式收到linecallstate_disconnected訊息時請使用lineclose(hline)釋放由lineopen分配的資源,呼叫lineshutdown(htapi)釋放為線路裝置分配的資源

三、軟硬體環境

下圖示意出了我們的應用程式所處的位置以及涉及到的軟硬體環境:

我們的通訊應用程式通過tapi操作modem撥號、應答、鏈結、掛機控制**呼叫,在編制dos應用程式的時候,我們經常使用hayes相容的at命令集來完成這些操作,由於各數據機廠家對該命令集都做了各自的擴充套件,因而,我們的dos應用程式一般只能操作一小部分數據機,而各廠家都提供windows驅動程式,所以,使用tapi編制的應用程式能夠操作絕大多數數據機;圖中的通訊api是應用程式傳送、接收資料的程式設計介面。

四、程式流程結構框圖

由於win98為多工作業系統,我們的流程圖只能代表本應用程式的執行先後關係,程式中的等待及檢測實際上是等待win98提供的訊息,所以並不占用cpu時間,在下面的程式中可以看出。另外,資料交換的協議可由自己制定,也可使用已有的協議。

五、軟體編制

由於windows程式設計的框架基本相同,在此我們只介紹涉及到通訊的一部分源程式:

1標頭檔案中應該包括:

#include

請注意工程檔案的屬性應該是windows32位應用程式

2通訊所涉及到的一些全域性變數定義及型別定義:

charrecbuf[20],buf[20]//緩衝區

dworderror; //錯誤碼

***statstatus; //狀態碼

dwordnumline; //允許使用的線路裝置數

linecallparamspara;//呼叫引數

tmydecframe*pwin=null;//主視窗指標

hlinemyhline;//線路控制代碼

handlemyhmodem;//數據機控制代碼

hcallmyhcall;//呼叫控制代碼

typedefstructtagmodemidmodemid;

3下面為獲取數據機控制代碼的函式定義

因為每個數據機的標誌字串長度不一,所以函式中用到了可變長度的字串,處理方法是先為字串指標分配sizeof(varstring)大小的空間,再利用該空間容納呼叫linegetid時windows返回的資訊,根據返回資訊判斷所需空間大小重新分配空間,再次呼叫linegetid就可以取得完整的標誌字串。

voidgethmodem(hlinehline)

str->dwtotalsize=dwsize;

} elsemark=0;

}while(mark==1);

if(mark==0)

free(str);

} 4在主視窗初始化函式中加入對線路的初始化過程:

pwin=this;//獲得主視窗指標

while(lineinitialize(&myhtapi,getmodule()->getinstance(),

(linecallback)makeprocinstance((farproc)lpfncallback,

getmodule()->getinstance()),"try",&numline)==lineerr_reinit)

; error=lineopen(htapi,0,&hline,0x10004,0,0,linecallprivilege_monitor+

linecallprivilege_owner,linemediamode_datamodem,null);

if(error!=0)

else }

} }

5呼叫方**函式的定義

voidfarpascaltmydecframe::lpfncallback

(dwordhdevice,dworddwmsg,

dworddwcallbackinstance,

dworddwparam1,dworddwparam2,

dworddwparam3)//

引數定義同linecallbackfunc函式中的引數定義 }

6被叫方**函式的定義

voidfarpascaltmydecframe::lpfncallback(dwordhdevice,dworddwmsg,

dworddwcallbackinstance,dworddwparam1,dworddwparam2,

dworddwparam3)

//只有對呼叫具有私有特權的呼叫者才能應答呼叫,

在此獲得呼叫控制代碼

switch(dwparam1) }

六、改進措施

dwordinternal;

dwordinternalhigh;

dwordoffset;

dwordoffsethigh;

handlehevent;

我們只用到了其中的hevent成員,其他成員均置0;hevent設定為createevent(null,true,false,null)產生的事件控制代碼;然後如下呼叫writefile(myhmodem,"received",8,&len,&myovlp);

WINXP下安裝WIN98的修復

正常的雙系統的安裝方法就是先安裝版本低的系統 win95 win98 win2000 winxp win2003 這裡主要以2個典型的雙系統來舉例 win98和winxp 1.安裝win98,設定bios從光碟啟動,安裝完畢之後,啟動系統進入win98.2.進入win98之後,把winxp的光碟放入...

在WIN98下以apache模組方式安裝php

在win98下以apache模組方式安裝php手記 foolboy chinaren.com 相關軟體 mod php程式設計客棧4 4.0.1 pl2.zip php 4.0.1pl2 win32.zip 以上軟體可以在www.php.net或者www.phpuser.com上 注意兩者的版本一定...

讓你的Win98 跑的更快 電腦加速度

1.在開機時不要載入太多不必要的常駐程式。2.autoexec.bat 和 config.sys 的內容保持空白,不需將光碟機的驅動程式掛上。3.自己設定虛擬記憶體為本身記記憶體的 2.5 倍,例如 有32mb 的記憶體就設虛擬記憶體為 80,且最大值和最小值都設一樣 控制面板 系統 效能能 虛擬記...