怎么用tapi拨电话啊?

zhi_liu6 2002-07-22 09:21:45
就是要拨到另外一部电话上边
或者哪里有例子也行啊
谢了先
...全文
47 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
peterli007 2002-07-22
  • 打赏
  • 举报
回复
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) 释 放 为 线 路 设 备 分 配 的 资 源
aha0 2002-07-22
  • 打赏
  • 举报
回复
int CallPhone(char *phoneNumber)
{
//用来接受初始化后的句柄。
HLINEAPP hLineApp;
//显示程序名字。
char * szAppName="callPhone程序";
//用于放置设备编号。
DWORD dwNumDevs=0;
//用于放置API版本号。
DWORD dwAPIVersion=0x00020000;
//用于得到返回信息。
LONG ret=-1;
LINEINITIALIZEEXPARAMS l_lineInitAlizeExparams;
memset((void *)&l_lineInitAlizeExparams,0,sizeof(LINEINITIALIZEEXPARAMS));
l_lineInitAlizeExparams.dwTotalSize=sizeof(LINEINITIALIZEEXPARAMS);
l_lineInitAlizeExparams.dwOptions=LINEINITIALIZEEXOPTION_USEEVENT;
//初始化线路。
ret=::lineInitializeEx(&hLineApp,NULL,NULL,szAppName,&dwNumDevs,&dwAPIVersion,&l_lineInitAlizeExparams);
if(ret!=0)
{
//可以加入一个处理错误的函数,告诉用户具体的错误。
MyMessageBox("电话线路处世化错误,\n请手动拨号。","提示",MB_OK|MB_SYSTEMMODAL);
lineShutdown(hLineApp);
return -1;
}
//确定要使用的设备ID。
DWORD dwCallbackInstance=0;
HLINE hLine;
LINEEXTENSIONID ExtensionID;
for(DWORD dwDeviceID=0;dwDeviceID<dwNumDevs;dwDeviceID++)
{
ret=lineNegotiateAPIVersion(
hLineApp,
dwDeviceID,
0x00020000,
0x00020001,
&dwAPIVersion,
&ExtensionID
);
if(ret==0)
{
//打开设备。
ret=lineOpen(hLineApp,
dwDeviceID,
&hLine, //接受线路句柄。
dwAPIVersion,
0,//扩充版本。
dwCallbackInstance, //上下文标识符,将由TAPI使用与这条线路有关的消息而返回给应用程序。TAPI不会解释这个数字,而是将其传递给应用程序。
LINECALLPRIVILEGE_NONE,//应用程序对线路所情求的特权。
0,
0);
if(ret==0)
break;
}
}
//有一个修正电话号码的区号问题。但此处不存在此问题。故不加上,如有另用,要加上。
//呼叫。
HCALL hCall;
if(ret==0)
{
ret=lineMakeCall(
hLine,
&hCall,
phoneNumber,
0,
0
);
}
//用来判断是否成功。
BOOL lb_Close=FALSE;
while(WaitForSingleObject(l_lineInitAlizeExparams.Handles.hEvent,8000)==WAIT_OBJECT_0)
{
//得到信息。
LINEMESSAGE lm;
if((ret=lineGetMessage(hLineApp,&lm,0))!=0)
{
MyMessageBox("电话信息错误,电话号码拨出失败,\n,请手动拨号。","提示",MB_OK|MB_SYSTEMMODAL);
break;
}
//从消息中判断类型。
if(lm.dwMessageID==LINE_CALLSTATE)
{
if(LINECALLSTATE_CONNECTED & lm.dwParam1
|| LINECALLSTATE_OFFERING & lm.dwParam1 )//连接状态。
{
lb_Close=TRUE;
// break;
}
}

else if(lm.dwMessageID==LINE_REPLY)
{
//函数成功.
if ((long)lm.dwParam2 < 0)
{
MyMessageBox("拨号错误","提示",MB_OK|MB_SYSTEMMODAL);
break;
}
/* if(lm.dwParam2==0)
{
lb_Close=TRUE;
lineDial(hCall,phoneNumber,0);
}
*/ }
}
//关闭线路。
lineClose(hLine);
lineShutdown(hLineApp);
if(lb_Close)
{
// ::MessageBox(NULL,"电话号码拨出成功。","提示",MB_OK);
return 1;
}
else
{
// ::MessageBox(NULL,"电话号码拨出失败。","提示",MB_OK);
return -1;
}
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧