我想用Tapi实现通话功能,在回调函数返回LINECALLSTATE_OFFERING后,执行lineAnswer,一到lineanser就自动挂机了。呼叫方和被呼叫方都没有到达返回LINECALLSTATE_CONNECTED,这一步。请问一下,这是什么原因啊?我的初始化函数跟回调函数是这样写的:
初始化:
   with CallParams do
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE;
//         dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE;   //不知道该用哪个,用哪个都是一样的结果
           dwMediaMode := LINEMEDIAMODE_DATAMODEM;
{ if you don't want the dialing dialog use LINEMEDIAMODE_DATAMODEM }
end;
if lineInitialize(lineApp, HInstance,
lineCallback, nil, nDevs) < 0 then { < 0 is an error }
lineApp := 0
else if nDevs = 0 then { no TAPI devices?? }
begin
lineShutDown(lineApp);
lineApp := 0;
end
else if lineNegotiateAPIVersion(lineApp, 1, $00010000, $10000000,
tapiVersion, extid) < 0 then { Check for version (copied from a TAPI sample) }
begin
lineShutDown(lineApp);
lineApp := 0;
end
        else if  lineOpen( lineApp , 1 , line , tapiVersion , 0 , 0 ,
                          LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER,
                          LINEMEDIAMODE_DATAMODEM, @CallParams)<0 then
                begin
                lineShutDown(lineApp);
                lineApp := 0;
                line := 0;
                end;
        if lineApp <> 0 then
                Memo1.Lines.Add( 'Monitoring calls...')
        else
                Memo1.Lines.Add( 'Error!');
回调函数:
if dwMsg = LINE_REPLY then { result of LineMakeCall }
if dwParam2 < 0 then
frmTAPICall.Memo1.Lines.Add('Reply error')
else
frmTAPICall.Memo1.Lines.Add('LINE_REPLY ok')
else if dwMsg = LINE_CALLSTATE then { change in line state }
begin
hCall := THCall(hDevice);
case dwParam1 of
LINECALLSTATE_IDLE: { call terminated }
if hcall <> 0 then
begin
lineDeallocateCall(hCall); { you must deallocate the call }
frmTAPICall.Memo1.Lines.Add('Idle - call deallocated');
frmTAPICall.btnCall.Enabled := True;
//frmTAPICall.btnDropCall.Enabled := False;
end;
LINECALLSTATE_CONNECTED: { Service connected }
if hCall <> 0 then
begin
s := 'Connected: ';
callinfo.dwTotalSize := 1024;
if lineGetCallInfo(hCall, callinfo) = 0 then
if callinfo.dwAppNameSize > 0 then
{$IFDEF WIN32}
s := s + (buf + callinfo.dwAppNameOffset); { this is more C-ish... }
{$ELSE}
s := s + StrPas((buf + callinfo.dwAppNameOffset)); { this is more C-ish... }
{$ENDIF}
frmTAPICall.Memo1.Lines.Add(s);
                                        lineMonitorDigits(hCall,dwdigitmodes);
end;
LINECALLSTATE_PROCEEDING: { call proceeding (dialing) }
frmTAPICall.Memo1.Lines.Add('Proceeding');
LINECALLSTATE_DIALING: { dialing }
frmTAPICall.Memo1.Lines.Add('Dialing');
LINECALLSTATE_DISCONNECTED: { disconnected }
begin
s := 'Disconnected: ';
if dwParam2 = LINEDISCONNECTMODE_NORMAL then
s := s + 'normal'
else if dwParam2 = LINEDISCONNECTMODE_BUSY then
s := s + 'busy';
frmTAPICall.Memo1.Lines.Add(s);
frmTAPICall.btnDropCall.Click;
end;
LINECALLSTATE_BUSY: { busy }
frmTAPICall.Memo1.Lines.Add('Busy');
                        LINECALLSTATE_OFFERING:
                                begin
                                frmTAPICall.Memo1.Lines.Add('ring...');
                                hCall := THCall(hDevice);
                                nReturn :=lineAnswer( hCall , nil , 0 );
                                if nReturn > $80000000 then
                                 frmTAPICall.Memo1.Lines.Add('Error in lineanswer')
                                else
                                        frmTAPICall.Memo1.Lines.Add('lineanswer:' 
                                              + IntToSt(lineAnswer(hCall, nil, 0)))
                                end; end;
end;
不知道有没有设置错误,请大虾们救命啊!

解决方案 »

  1.   

    看了以前CSDN里也有人遇到过类似的问题,不知道大家都解决了没啊~~~
      

  2.   

    初始化函数:
    lineInitialize(lineApp, HInstance, lineCallback, nil, nDevs)
    TAPI版本:
    lineNegotiateAPIVersion(lineApp, 1, $00010000, $10000000, tapiVersion, extid) 
    线路打开: 
    lineOpen(lineApp, 1, line, tapiVersion, 0, 0, 
                            LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER, 
                            LINEMEDIAMODE_DATAMODEM, @CallParams) 接听:
    case LINE_CALLSTATE of 
       LINECALLSTATE_OFFERING:
          lineAnswer( hCall , nil , 0 )不知道这样的过程有没有错,或者少了什么,参数设置有没有错啊?