<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al

         

         

        基 于Win95 TAPI 的 調(diào) 制 解 調(diào) 器 編 程

        譚 安 平----中 國 科 學 院 近 代 物 理 研 究 所( 7 3 0 0 0 0)

        一、 簡 介:

        ---- 隨 著Win95 操 作 系 統(tǒng) 的 普 及, 計 算 機 之 間 的 通 信 已 經(jīng) 成 為 大 多 數(shù) 應 用 程 序 開 發(fā) 的 要 求, 這 其 中 的 主 要 原 因 是Win95 不 僅 僅 能 夠 支 持 大 多 數(shù) 硬 件, 而 且 為 硬 件 的 操 作 提 供 了 方 便 的 編 程 接 口(API),Win95 的 應 用 程 序 接 口(API) 提 供 的 通 信 手 段 大 致 分 為 以 下 幾 類: 1 基 于TCP/IP 協(xié) 議 的Winsock API, 可 實 現(xiàn) 局 域 網(wǎng) 上 或 互 聯(lián) 網(wǎng) 上 的 微 機 通 信; 2 基 于 進 程 之 間 的 通 信 技 術: 動 態(tài) 數(shù) 據(jù) 交 換( D D E); 3 基 于 直 接 電 纜 連 接 的 通 信 技 術, 可 直 接 操 作 串 行 口、 并 行 口 以 及 遠 紅 外 線 接 口; 4 基 于 電 話 線 路 的 通 信 應 用 程 序 接 口( T A P I/Telephony API), 可 方 便 地 控 制 調(diào) 制 解 調(diào) 器; 從 目 前 的 發(fā) 展 狀 況 看 來, 調(diào) 制 解 調(diào) 器 已 經(jīng) 成 為 遠 距 離 通 信 的 一 種 重 要 工 具, 為 此Microsoft 及Intel 公 司 聯(lián) 合 開 發(fā) 了TAPI 這 樣 一 個 編 程 接 口, 而 且, 使 用API 函 數(shù) 編 制 的 程 序 段 既 適 用 于Borland C++ 編 譯 器, 同 時 也 能 插 入Visual C++ 程 序 中 編 譯 運 行, 作 為Win95 的 應 用 程 序 編 制 人 員, 學 會 使 用TAPI 編 程 操 作 調(diào) 制 解 調(diào) 器 通 過 電 話 線 路 進 行 通 信 這 一 技 術 是 很 有 必 要 的。 下 面 就TAPI 編 程 進 行 討 論:

        二、 通 信 過 程 描 述

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

        ---- 通 過 使 用lineInitialize 函 數(shù) 初 始 化TAPI.DLL 得 到TAPI 使 用 句 柄 的 指 針hTapi, 請 注 意 參 數(shù) 中 回 調(diào) 函 數(shù) 的 定 義( 所 有 提 及 函 數(shù) 的 用 法 均 可 從BC++5.0 及Visual C++5.0 的 幫 助 中 獲 得); 通 過 調(diào) 用lineOpen 函 數(shù)( 用 到 參 數(shù)hTapi) 獲 得 線 路 句 柄hLine; 再 利 用lineGetID( 用 到 參 數(shù)hLine) 獲 取 調(diào) 制 解 調(diào) 器 句 柄hModem

        ---- 2 配 置 線 路( 可 選)

        ----

        ---- 調(diào) 用SetCommConfig( 用 到hModem) 改 變 調(diào) 制 解 調(diào) 器 的 設 置

        ---- 3 撥 號( 由 呼 叫 方 執(zhí) 行)

        ---- 使 用lineMakeCall 函 數(shù)( 用 到hLine) 進 行 撥 號, 完 成 后 獲 得 呼 叫 句 柄hCall( 呼 叫 方 的 呼 叫 句 柄)

        ---- 4 應 答 鏈 接( 由 被 呼 叫 方 執(zhí) 行)

        ---- 被 呼 叫 的 一 方 的 回 調(diào) 函 數(shù) 得 到LINECALLSTATE_OFFERING 消 息 時, 調(diào) 用lineAnswer 函 數(shù) 實 現(xiàn) 自 動 應 答( 呼 叫 句 柄hCall 由 回 調(diào) 函 數(shù) 的 參 數(shù) 給 出)

        ---- 5 數(shù) 據(jù) 通 信( 雙 方)

        ---- 當 回 調(diào) 函 數(shù) 收 到LINECALLSTATE_CONNECTED 消 息 后, 請 先 清 除 接 收 緩 沖 區(qū), 可 以 使 用 函 數(shù) 為WriteFile 及ReadFile 函 數(shù) 進 行 數(shù) 據(jù) 交 換, 注 意 參 數(shù)hFile 為 調(diào) 制 解 調(diào) 器 句 柄hModem

        ---- 6 掛 機( 某 一 方)

        ---- 通 信 完 畢 任 何 一 方 都 可 以 調(diào) 用 函 數(shù)lineDrop(hCall,NULL,0) 來 停 止 呼 叫, 該 函 數(shù) 還 發(fā) 送LINECALLSTATE_IDLE 消 息 給 回 調(diào) 函 數(shù)

        ---- 7 關 閉 線 路( 雙 方)

        ---- 通 信 雙 方 的 回 調(diào) 函 數(shù) 在 收 到LINECALLSTATE_IDLE 消 息 時 都 應 該 調(diào) 用 函 數(shù)lineDeallocateCall(hCall) 釋 放 相 應 呼 叫 占 用 的 資 源; 當 回 調(diào) 函 數(shù) 收 到LINECALLSTATE_DISCONNECTED 消 息 時 請 使 用lineClose(hLine) 釋 放 由lineOpen 分 配 的 資 源, 調(diào) 用lineShutDown(hTapi) 釋 放 為 線 路 設 備 分 配 的 資 源

        三、 軟 硬 件 環(huán) 境

        ---- 下 圖 示 意 出 了 我 們 的 應 用 程 序 所 處 的 位 置 以 及 涉 及 到 的 軟 硬 件 環(huán) 境:

        ---- 我 們 的 通 信 應 用 程 序 通 過TAPI 操 作Modem 撥 號、 應 答、 鏈 接、 掛 機 控 制 電 話 呼 叫, 在 編 制DOS 應 用 程 序 的 時 候, 我 們 經(jīng) 常 使 用Hayes 兼 容 的AT 命 令 集 來 完 成 這 些 操 作, 由 于 各 調(diào) 制 解 調(diào) 器 廠 家 對 該 命 令 集 都 做 了 各 自 的 擴 展, 因 而, 我 們 的DOS 應 用 程 序 一 般 只 能 操 作 一 小 部 分 調(diào) 制 解 調(diào) 器, 而 各 廠 家 都 提 供Windows 驅 動 程 序, 所 以, 使 用TAPI 編 制 的 應 用 程 序 能 夠 操 作 絕 大 多 數(shù) 調(diào) 制 解 調(diào) 器; 圖 中 的 通 信API 是 應 用 程 序 發(fā) 送、 接 收 數(shù) 據(jù) 的 編 程 接 口。

        四、 程 序 流 程 結 構 框 圖

        ---- 由 于Win95 為 多 任 務 操 作 系 統(tǒng), 我 們 的 流 程 圖 只 能 代 表 本 應 用 程 序 的 執(zhí) 行 先 后 關 系, 程 序 中 的 等 待 及 檢 測 實 際 上 是 等 待Win95 提 供 的 消 息, 所 以 并 不 占 用CPU 時 間, 在 下 面 的 程 序 中 可 以 看 出。 另 外, 數(shù) 據(jù) 交 換 的 協(xié) 議 可 由 自 己 制 定, 也 可 使 用 已 有 的 協(xié) 議。

        五、 軟 件 編 制

        ---- 由 于Windows 編 程 的 框 架 基 本 相 同, 在 此 我 們 只 介 紹 涉 及 到 通 信 的 一 部 分 源 程 序:

        ---- 1 頭 文 件 中 應 該 包 括:

        ---- #include < tapi.h >

        ---- 請 注 意 工 程 文 件 的 屬 性 應 該 是Windows 32 位 應 用 程 序

        ---- 2 通 信 所 涉 及 到 的 一 些 全 局 變 量 定 義 及 類 型 定 義:

        char RecBuf[20],buf[20]// 緩 沖 區(qū)
        DWORD  Error;	// 錯 誤 碼
        COMSTAT  Status;	// 狀 態(tài) 碼
        DWORD  NumLine;	// 允 許 使 用 的 線 路 設 備 數(shù)
        LINECALLPARAMS  para;// 呼 叫 參 數(shù)
        TmyDecFrame * pwin=NULL;// 主 窗 口 指 針
        HLINEAPP  myhTapi;// 線 路 應 用 程 序 句 柄
        HLINE  myhLine;// 線 路 句 柄
        HANDLE  myhModem;// 調(diào) 制 解 調(diào) 器 句 柄
        HCALL  myhCall;// 呼 叫 句 柄
        
        typedef  struct tagModemID{
        		HANDLE hModem;
           		char ModemName[1];
        }ModemID;
        

        ---- 3 下 面 為 獲 取 調(diào) 制 解 調(diào) 器 句 柄 的 函 數(shù) 定 義

        ---- 因 為 每 個 調(diào) 制 解 調(diào) 器 的 標 志 字 符 串 長 度 不 一, 所 以 函 數(shù) 中 用 到 了 可 變 長 度 的 字 符 串, 處 理 方 法 是 先 為 字 符 串 指 針 分 配sizeof(VARSTRING) 大 小 的 空 間, 再 利 用 該 空 間 容 納 調(diào) 用LineGetID 時Windows 返 回 的 信 息, 根 據(jù) 返 回 信 息 判 斷 所 需 空 間 大 小 重 新 分 配 空 間, 再 次 調(diào) 用LineGetID 就 可 以 取 得 完 整 的 標 志 字 符 串。

        void GethModem(HLINE hLine)
        {  	ModemID far *mid;
           			VARSTRING * str;
           			LONG lid;
           		DWORD size;
           			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- >dwTotalSize < str- > dwNeededSize))
           			{	dwSize=str- >dwNeededSize;
           		   			free(str);
                		 		str=(VARSTRING *)malloc(dwSize);
                 			if(!str)
        	        		 	{	myhModem=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 在 主 窗 口 初 始 化 函 數(shù) 中 加 入 對 線 路 的 初 始 化 過 程:

        pwin=this;// 獲 得 主 窗 口 指 針
          	while(lineInitialize(&myhTAPI,GetModule()- >GetInstance(),
            			(LINECALLBACK)MakeProcInstance((FARPROC) lpfnCallback,
                    	GetModule()- >GetInstance()), "TRY",&NumLine )==LINEERR_REINIT)
           	{	sleep(1);// 延 遲   	};
        	Error=lineOpen(hTAPI,0,&HLine,0x10004,0,0,LINECALLPRIVILEGE_MONITOR+
        LINECALLPRIVILEGE_OWNER,LINEMEDIAMODE_DATAMODEM,NULL);
           		if(Error!=0)
        		{	sprintf(buf,"%lx",Error);
        MessageBox(buf,0,MB_OK);	}
        		else
        		{	GethModem(myhLine);// 取 得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 呼 叫 方 回 調(diào) 函 數(shù) 的 定 義

        void far pascal  TMyDecFrame::lpfnCallback
                   (DWORD hDevice, DWORD dwMsg,
        DWORD dwCallbackInstance, 
                DWORD dwParam1, DWORD dwParam2,
        DWORD dwParam3)// 
           參數(shù)定義同lineCallbackFunc函數(shù)中的參數(shù)定義
        {  	int Rec_num=0;
        
        	switch(dwParam1)
        	{	case LINECALLSTATE_CONNECTED:
                 DWORD len;
        		   ClearCommError(myhModem,&Error,&Status);
                 	Rec_num=Status.cbInQue;
           			ReadFile(myhModem,RecBuf,Rec_num,&len,0);
        //至此已經(jīng)為數(shù)據(jù)通信做好了前期準備,可設立標志
              		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 被 叫 方 回 調(diào) 函 數(shù) 的 定 義

        void far pascal  TMyDecFrame::lpfnCallback(DWORD hDevice, DWORD dwMsg,
            		DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2,
            		DWORD dwParam3)
        {  int Rec_num=0;
        
        	switch(dwParam3)
        	{	case LINECALLPRIVILEGE_OWNER:
        			myhCall=(HCALL)hDevice;
        			Break;
        	}//只有對呼叫具有私有特權的調(diào)用者才能應答呼叫,
              在此獲得呼叫句柄
        	switch(dwParam1)
        	{	case LINECALLSTATE_CONNECTED:
                 	DWORD len;
        		   	ClearCommError(myhModem,&Error,&Status);
                 	Rec_num=ComS.cbInQue;
           		ReadFile(myhModem,RecBuf,Rec_num,&len,0);// 清 除 接 收 緩 沖 區(qū)
          			ReadFile(myhModem,RecBuf,7,&len,0);
            		WriteFile(myhModem,"Received",8,&len,0);
        			pwin- >MessageBox(RecBuf,0,MB_OK);
                  	break;
        		case LINECALLSTE_OFFERING:
        			lineAnswer(myhCall,NULL,0);
        			break;// 完 成 自 動 應 答
        		case LINECALLSTATE_IDLE:
        			lineDeallocateCall(myhCall);
        			break;
        case LINECALLSTATE_DISCONNECTED:
        	lineClose(myhLine);
        	lineShutDown(myhTapi);
        	break;
           		}
        }
        

        六、 改 進 措 施

        ---- 以 上 程 序 中 使 用 的 是 同 步 讀 寫 方 式, 只 要WriteFile 或 者ReadFile 沒 有 完 成 指 定 的I/O 任 務, 它 們 就 不 會 返 回 進 程, 在 許 多 情 況 下, 這 是 令 人 難 以 容 忍 的CPU 時 間 浪 費; 改 進 的 辦 法 是 在 每 次 讀 之 前 采 用ClearCommError 函 數(shù) 確 定 系 統(tǒng) 的 串 行 口 緩 沖 區(qū) 中 到 底 有 了 多 少 字 節(jié) 的 接 收 數(shù) 據(jù), 而 寫 方 式 采 用 異 步 方 式, 首 先 應 該 定 義 一 個OVERLAPPED 結 構, 從BC++5.0 中 獲 得 的 結 構 定 義 如 下:
        typedef struct _OVERLAPPED { // o 
            DWORD  Internal; 
            DWORD  InternalHigh; 
            DWORD  Offset; 
            DWORD  OffsetHigh; 
            HANDLE hEvent; 
        } OVERLAPPED;  
        

        ---- 我 們 定 義OVERLAPPED myOVLP;

        ---- 我 們 只 用 到 了 其 中 的hEvent 成 員, 其 他 成 員 均 置0;hEvent 設 置 為CreateEvent(NULL,TRUE,F(xiàn)ALSE,NULL) 產(chǎn) 生 的 事 件 句 柄; 然 后 如 下 調(diào) 用WriteFile(myhModem,"Received",8,&len,&myOVLP);

        ---- 函 數(shù) 將 立 即 返 回, 此 后, 只 要GetOverlappedResult 函 數(shù) 返 回TRUE, 寫操作就 算 完 成 了。

         

        主站蜘蛛池模板: 日产精品久久久久久久蜜臀 | av日韩在线一区二区三区| 日日躁狠狠躁狠狠爱| 国产精品自在拍首页视频8 | 国精品91人妻无码一区二区三区 | 国产免费福利网站| 日韩不卡免费视频| 日韩国产中文字幕精品| 日本一卡2卡3卡4卡无卡免费| 在线欧美中文字幕农村电影| 亚洲国产成人自拍视频网| 亚洲精品成人一二三专区| 免费国产一级特黄aa大片在线| 亚洲国产五月综合网| 久久亚洲av成人无码国产| 欧美丰满熟妇bbbbbb| 中文字幕第一页国产| 久久久久国产一级毛片高清版A| AV老司机色爱区综合| 亚洲国产精品综合福利专区| 久久精品国产99麻豆蜜月| 日韩中文字幕高清有码| 亚洲AV日韩精品久久久久| 成人免费精品网站在线观看影片| 看全黄大色黄大片视频| 又黄又硬又湿又刺激视频免费| 色伊人国产高清在线| 国产色无码专区在线观看| 精品视频无码一区二区三区| 日韩有码中文在线观看| 久久96热在精品国产高清| 精品国产成人一区二区| 国产激情艳情在线看视频| a国产一区二区免费入口| 91福利视频一区二区| mm1313亚洲国产精品无吗| 国产女人喷潮视频免费| 久久久久久99精品热久久| 国产精品综合色区在线观| 视频一区二区三区中文字幕狠狠| 亚欧洲乱码视频在线专区|