亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? win9xapi.txt

?? MODEM編程
?? TXT
字號:
基 于Win95 TAPI 的 調 制 解 調 器 編 程 
譚 安 平----中 國 科 學 院 近 代 物 理 研 究 所

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

二、 通 信 過 程 描 述
---- 1 初 始 化 線 路( 通 信 雙 方 都 應 該 初 始 化 線 路) 
---- 通 過 使 用lineInitialize 函 數 初 始 化TAPI.DLL 得 到TAPI 使 用 句 柄
 的 指 針hTapi, 請 注 意 參 數 中 回 調 函 數 的 定 義( 所 有 提 及 函 數
 的 用 法 均 可 從BC++5.0 及Visual C++5.0 的 幫 助 中 獲 得); 通 過 調 用
lineOpen 函 數( 用 到 參 數hTapi) 獲 得 線 路 句 柄hLine; 再 利 用lineGetID
( 用 到 參 數hLine) 獲 取 調 制 解 調 器 句 柄hModem 

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

---- 

---- 調 用SetCommConfig( 用 到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 是 應 用 程 序 發 送、 接 收 數 據 的 編 程 接 口。 

四、 程 序 流 程 結 構 框 圖
---- 由 于Win95 為 多 任 務 操 作 系 統, 我 們 的 流 程 圖 只 能 代 表 本
 應 用 程 序 的 執 行 先 后 關 系, 程 序 中 的 等 待 及 檢 測 實 際 上 是
 等 待Win95 提 供 的 消 息, 所 以 并 不 占 用CPU 時 間, 在 下 面 的 程 序
 中 可 以 看 出。 另 外, 數 據 交 換 的 協 議 可 由 自 己 制 定, 也 可 使
 用 已 有 的 協 議。 
五、 軟 件 編 制
---- 由 于Windows 編 程 的 框 架 基 本 相 同, 在 此 我 們 只 介 紹 涉 及 到
 通 信 的 一 部 分 源 程 序: 
---- 1 頭 文 件 中 應 該 包 括: 

---- #include < tapi.h > 

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

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

char RecBuf[20],buf[20]// 緩 沖 區
DWORD  Error;	// 錯 誤 碼
COMSTAT  Status;	// 狀 態 碼
DWORD  NumLine;	// 允 許 使 用 的 線 路 設 備 數
LINECALLPARAMS  para;// 呼 叫 參 數
TmyDecFrame * pwin=NULL;// 主 窗 口 指 針
HLINEAPP  myhTapi;// 線 路 應 用 程 序 句 柄
HLINE  myhLine;// 線 路 句 柄
HANDLE  myhModem;// 調 制 解 調 器 句 柄
HCALL  myhCall;// 呼 叫 句 柄

typedef  struct tagModemID{
		HANDLE hModem;
   		char ModemName[1];
}ModemID;

---- 3 下 面 為 獲 取 調 制 解 調 器 句 柄 的 函 數 定 義 

---- 因 為 每 個 調 制 解 調 器 的 標 志 字 符 串 長 度 不 一, 所 以 函 數 
中 用 到 了 可 變 長 度 的 字 符 串, 處 理 方 法 是 先 為 字 符 串 指 針 分
 配sizeof(VARSTRING) 大 小 的 空 間, 再 利 用 該 空 間 容 納 調 用LineGetID
 時Windows 返 回 的 信 息, 根 據 返 回 信 息 判 斷 所 需 空 間 大 小 重 新 分
 配 空 間, 再 次 調 用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 在 主 窗 口 初 始 化 函 數 中 加 入 對 線 路 的 初 始 化 過 程: 

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 呼 叫 方 回 調 函 數 的 定 義 

void far pascal  TMyDecFrame::lpfnCallback
           (DWORD hDevice, DWORD dwMsg,
DWORD dwCallbackInstance, 
        DWORD dwParam1, DWORD dwParam2,
DWORD dwParam3)// 
   參數定義同lineCallbackFunc函數中的參數定義
{  	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);
//至此已經為數據通信做好了前期準備,可設立標志
      		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 被 叫 方 回 調 函 數 的 定 義 

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;
	}//只有對呼叫具有私有特權的調用者才能應答呼叫,
      在此獲得呼叫句柄
	switch(dwParam1)
	{	case LINECALLSTATE_CONNECTED:
         	DWORD len;
		   	ClearCommError(myhModem,&Error,&Status);
         	Rec_num=ComS.cbInQue;
   		ReadFile(myhModem,RecBuf,Rec_num,&len,0);// 清 除 接 收 緩 沖 區
  			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 函 數 確 定 系 統 的 串 行 口
 緩 沖 區 中 到 底 有 了 多 少 字 節 的 接 收 數 據, 而 寫 方 式 采 用 
異 步 方 式, 首 先 應 該 定 義 一 個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,FALSE,NULL) 產 生 的 事 件 句 柄; 然 后 如 下 
調 用WriteFile(myhModem,"Received",8,&len,&myOVLP); 

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


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品日韩精品欧美在线| 国产高清在线精品| 性做久久久久久免费观看| 91免费视频网址| 中文字幕精品在线不卡| 裸体一区二区三区| 91超碰这里只有精品国产| 国产精品私人影院| 看片网站欧美日韩| 精品美女在线观看| 极品少妇xxxx精品少妇偷拍| 欧美一区二区啪啪| 日本伊人色综合网| 色呦呦网站一区| 一区二区三区中文在线| 色综合久久久久久久| 国产亚洲欧美一区在线观看| 久久精品国产免费看久久精品| 91视频com| 日韩精品五月天| 精品久久久久久久久久久院品网 | 免费观看30秒视频久久| 成人国产免费视频| 亚洲欧美日韩一区二区| 日本高清成人免费播放| 亚洲电影在线播放| 欧美一级欧美三级在线观看 | 91在线看国产| 亚洲一区二区av在线| 欧美日韩综合不卡| 国产精品白丝av| 亚洲女爱视频在线| 717成人午夜免费福利电影| 国产91在线观看| 国产成人综合视频| 视频一区二区三区入口| 国产欧美日韩在线看| 在线视频欧美精品| 国产自产2019最新不卡| 亚洲美女屁股眼交3| 精品黑人一区二区三区久久| 在线视频中文字幕一区二区| 国产高清成人在线| 无码av免费一区二区三区试看| 日本一区二区综合亚洲| 欧美精品tushy高清| 欧美日韩一区二区在线观看视频 | 国产日韩欧美在线一区| 日韩一区国产二区欧美三区| 成人av资源网站| 国产精一品亚洲二区在线视频| 香蕉久久夜色精品国产使用方法| 久久久久久黄色| 日韩精品一区二区三区视频在线观看 | 99久久99久久精品免费看蜜桃| 国产精品二三区| 亚洲人成精品久久久久| 日韩欧美专区在线| 欧美一区二区三区喷汁尤物| 欧美视频一区二区三区在线观看| 国产99精品国产| 国产一区二区三区久久久| 久久精品国产第一区二区三区 | 欧美久久久一区| 欧美久久婷婷综合色| 日韩一二三区不卡| 欧美精品一区男女天堂| 亚洲天堂av一区| 欧美一a一片一级一片| 国产精品一区二区久久精品爱涩| 国产一区二区三区免费在线观看| 国产成都精品91一区二区三| 成人夜色视频网站在线观看| 成人性色生活片免费看爆迷你毛片| 国产米奇在线777精品观看| 成人福利视频在线看| 欧美三级视频在线观看| 久久婷婷国产综合国色天香| 中文字幕av资源一区| 亚洲伦理在线精品| 激情五月播播久久久精品| 成人黄色国产精品网站大全在线免费观看 | 国产拍欧美日韩视频二区| 国产精品久久网站| 理论片日本一区| 在线影视一区二区三区| 2024国产精品| 日韩黄色免费电影| eeuss鲁片一区二区三区在线观看| 欧美日韩免费高清一区色橹橹 | 日本一区二区三区在线不卡| 午夜免费久久看| 欧美一区二区在线播放| 中文字幕在线观看一区二区| 精品一区二区在线观看| 91.麻豆视频| 亚洲高清不卡在线| 色婷婷综合中文久久一本| 国产欧美一区二区三区沐欲 | 日韩欧美123| 日韩中文字幕91| 日韩欧美中文一区| 亚洲18色成人| 成人一区二区三区| 色婷婷香蕉在线一区二区| 色爱区综合激月婷婷| 9191久久久久久久久久久| 亚洲国产精品一区二区www | 99久久综合狠狠综合久久| 精品久久久久久无| 国产高清久久久| 中文字幕亚洲精品在线观看 | fc2成人免费人成在线观看播放| 欧美精品一区二区三区久久久| 美日韩一级片在线观看| 26uuu久久天堂性欧美| av一本久道久久综合久久鬼色| 舔着乳尖日韩一区| 91麻豆免费视频| 国产欧美一区二区精品性色| 久久激情五月婷婷| 亚洲欧洲日韩av| 在线播放中文一区| 日本sm残虐另类| 欧美成人官网二区| 日本美女一区二区| 精品国产乱码久久久久久1区2区| 国产精品自拍在线| 亚洲色图欧洲色图婷婷| 在线观看精品一区| 豆国产96在线|亚洲| 亚洲成人一区在线| 国产欧美日韩三区| 综合欧美亚洲日本| 欧美日韩一卡二卡| 欧美亚洲高清一区| 成人免费视频视频| 美女一区二区视频| 亚洲成a人v欧美综合天堂| 中文乱码免费一区二区| 日韩午夜中文字幕| av电影一区二区| 国产在线精品免费av| 裸体在线国模精品偷拍| 另类成人小视频在线| 亚洲国产日韩av| ...中文天堂在线一区| 91麻豆精品国产91久久久资源速度 | 成人av网址在线| 国产成人免费视频| 高清久久久久久| 91亚洲国产成人精品一区二三| 国产精品自拍在线| 韩国女主播成人在线观看| 懂色一区二区三区免费观看| 国产精品一区二区黑丝| 国产精品66部| 不卡的电视剧免费网站有什么| 丁香一区二区三区| 95精品视频在线| 99国产精品久久久| 欧美精品视频www在线观看| 在线观看一区二区视频| 欧美亚洲高清一区| 91官网在线观看| 日韩一区二区三区精品视频| 91精品国产91久久久久久一区二区| 欧美精品电影在线播放| 日韩精品中文字幕在线不卡尤物| 国产午夜亚洲精品羞羞网站| 中文字幕精品综合| 午夜电影久久久| 成人18视频在线播放| 欧美福利一区二区| 国产丝袜美腿一区二区三区| 欧美激情一区二区三区在线| 亚洲精品日韩综合观看成人91| 日本欧美加勒比视频| 懂色av中文一区二区三区| 欧美日韩一区二区三区在线| 欧美美女网站色| 国产精品理论片| 麻豆精品一区二区三区| 99精品久久99久久久久| 久久久天堂av| 紧缚奴在线一区二区三区| 在线不卡免费欧美| 亚洲精品国产无套在线观| 国产毛片一区二区| 亚洲精品一区二区三区蜜桃下载 | 91极品视觉盛宴| 国产欧美日韩不卡免费| 国产一区二区三区精品欧美日韩一区二区三区| 国产乱码精品1区2区3区| 欧美日韩在线播放三区四区| 1区2区3区精品视频| 成人精品一区二区三区中文字幕 | 91官网在线免费观看| 欧美国产综合一区二区| 成人h动漫精品一区二|