---- 隨 著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 編 程 進 行 討 論:
---- 通 過 使 用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 是 應 用 程 序 發 送、 接 收 數 據 的 編 程 接 口。
---- 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;
}
}
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, 寫操作就 算 完 成 了。
日本亚州欧洲精品不卡| 精品一区二区三区中文字幕在线| 久久高清免费| 久久香蕉精品| 六月天综合网| 日韩福利视频导航| 国产aⅴ精品一区二区三区久久 | 精品视频97| 91视频精品| 宅男噜噜噜66国产日韩在线观看| 日韩电影免费网址| 蜜桃久久av一区| 一区在线视频观看| 鲁鲁在线中文| 久久国产麻豆精品| 亚洲精选91| 超级白嫩亚洲国产第一| 视频福利一区| 日韩在线中文| 日本不卡在线视频| 日韩欧美2区| 99在线观看免费视频精品观看| 一区二区三区国产在线| 国产精品嫩草99av在线| 日韩电影免费网址| 在线视频亚洲| 青青在线精品| 在线亚洲成人| 亚洲精品欧洲| 久久精品欧洲| 亚洲免费福利| 91精品91| 国产欧美自拍| 欧美一区二区三区激情视频 | 亚洲午夜av| 久久精品国产亚洲夜色av网站| 免费看黄色91| 国产乱人伦精品一区| 日韩精品不卡一区二区| 国产欧美日韩视频在线| 亚洲成av在线| 激情欧美亚洲| 91精品国产调教在线观看| 国产日韩免费| 97精品在线| 美女精品视频在线| 亚洲成av人片一区二区密柚| 国产欧美日韩一区二区三区在线| 亚洲三级av| 国产精品激情| 蜜桃精品视频| 亚洲欧美日本日韩| 久久成人国产| 亚洲激情av| 伊人影院久久| 欧美亚洲自偷自偷| 日韩国产91| 国产日韩一区二区三区在线 | 欧美日韩在线播放视频| 国产精品观看| 国产精久久久| 国产色综合网| 欧美在线日韩| 国产亚洲一区在线| 99久久精品国产亚洲精品| 久久国产精品99国产| 日本中文字幕一区二区| 久久男女视频| 国产农村妇女精品一二区| 久久久五月天| 麻豆视频一区二区| 欧美片第1页| 欧美一区免费| 亚洲成人国产| 美女网站视频一区| 精品一区在线| 91综合网人人| 日韩精品中文字幕吗一区二区| 超碰在线99| 久久精品观看| 久久精品国产在热久久| 国产高清视频一区二区| 国产视频一区欧美| 午夜久久久久| 神马午夜在线视频| 天堂久久一区| 欧美日本精品| 日韩高清二区| 亚洲综合电影| 日韩在线视频精品| 日韩高清欧美| 精品一区二区三区的国产在线观看| 国产综合色产| 久久精品97| 欧美a在线观看| 国产亚洲高清在线观看| 久久99伊人| 日本不卡视频一二三区| 国产欧美亚洲精品a| 久久视频国产| 99精品视频精品精品视频| 久久久久久久欧美精品| 亚洲黄色免费看| 麻豆国产精品一区二区三区| 深夜日韩欧美| 美女国产精品久久久| 麻豆国产精品视频| 日韩一区二区三区精品| 亚洲一级黄色| 欧美一级二级视频| 久久精品一本| 视频一区日韩| 美女网站久久| 国产欧美午夜| 亚洲免费观看| 午夜亚洲福利在线老司机| 日韩视频在线一区二区三区 | 亚洲精品91| 免费日韩av片| 久久国产主播| а√天堂8资源在线| 久久久久久久久成人| 蜜臀av国产精品久久久久| 欧美日韩激情在线一区二区三区| 人人精品久久| 精品免费视频| 欧美日一区二区三区在线观看国产免 | 伊伊综合在线| 日本一区中文字幕| 午夜国产精品视频免费体验区| 香蕉国产精品| 久久免费国产| 久久99久久久精品欧美| 国产一区二区三区国产精品| 一区二区三区四区在线看| 日韩视频免费| 国产精品久久| 国产精品黄网站| 免费成人网www| 亚洲免费一区二区| 日韩精品一区二区三区免费观看| 99国产精品99久久久久久粉嫩| 天堂久久一区| 国产亚洲毛片在线| 日韩精品午夜| 九一精品国产| 日韩精品网站| 免费不卡在线观看| 成人精品中文字幕| 日韩视频一区| 欧美日一区二区三区在线观看国产免 | 丝袜a∨在线一区二区三区不卡| 欧美永久精品| 国产一卡不卡| 国产精品一区二区av日韩在线| 日韩黄色免费网站| 日韩av中文字幕一区二区| 亚洲二区免费| 国产精品老牛| 日韩精品免费观看视频| 午夜av不卡| 日本国产一区| 国内揄拍国内精品久久| 欧美午夜网站| 国产日韩视频在线| 四虎国产精品免费久久| 精品久久精品| 亚洲免费一区二区| 国产精品久久久久9999高清 | 日韩午夜av在线| 欧美日韩在线观看首页| 久久精品国产999大香线蕉| 国产精品网站在线看| 青草久久视频| 人人爱人人干婷婷丁香亚洲| 国产精品激情电影| 久久精品国产一区二区| 免费精品国产| 久久亚洲一区| 欧美一区在线观看视频| 在线国产日韩| 国产日韩综合| 日韩精品一卡二卡三卡四卡无卡| 国产拍在线视频| 久久久精品网| 91精品久久久久久久久久不卡| 欧美一区精品| 国产黄色精品| | av中文字幕在线观看第一页| 免费久久精品视频| 在线精品亚洲| 91精品一区| 亚洲少妇一区| 女主播福利一区| 蜜桃久久久久| 国产精品97| 久久精品免费看| 欧美日韩国产综合网| 国产色噜噜噜91在线精品|