Имеется код с использованием TAPI, который я немогу заставить адекватно работать. Длительные поиски не привели к успеху (встречалась пара подобных вопросов без ответов и какой-то пример на С++(не факт, что рабочий)), поэтому решил спросить здесь.
В чем заключается проблема: не удается получить ответ из CallBack функции.
сам код (сборная солянка + сам ковырял, поэтому прошу сильно не пинать):
- Код: Выделить всё
#Compile Exe
#Dim All
#Include "Tapi32.inc"
#Include "WinUser.inc"
Global tapiStatus As LINECALLSTATUS
Global hComm As Dword
Global hLine As Dword, hCall As Dword
Global hTapiApp As Dword
Function PBMain
Local numberToDial As String
numberToDial = $DefNumberToDial
1:
Con.Input "Nomer: ", numberToDial
dial(numberToDial)
GoTo 1
End Function
Function Dial(phoneNumber As String) As Long
Local lRet As Long, hApiVersion, numLines, lineNo As Dword
Local lcparams As LINECALLPARAMS, minVer, maxVer, dwAPIVersion As Dword
Local numberToDial As AsciiZ * 32
Local lineParams As LINECALLPARAMS, extID As LINEEXTENSIONID
Local lip As LINEINITIALIZEEXPARAMS
Local hInstance As Dword
Local i As Long
Local Msg As tagMsg
lip.dwtotalsize = Len(lip)
lip.dwoptions = %LINEINITIALIZEEXOPTION_USEHIDDENWINDOW
hApiVersion = %TAPI_CURRENT_VERSION
numberToDial = phoneNumber
hInstance = GetModuleHandle(ByVal %NULL)
Print hInstance
'PeekMessage(msg, %Null, 0, 0, %PM_REMOVE)
lRet = lineInitializeEx(hTapiApp, hInstance, CodePtr(tapiCallback), "weqweqweqeweqwe", numLines, hApiVersion, lip)
If lRet Then
Print "Error on LineInitialize: " + Str$(lRet)
End If
Print "Lines count:" + Str$(numLines)
lineNo = -1
For i = 0 To numLines - 1
minVer = &h00010004
maxVer = &h00020000
lRet = LineNegotiateAPIVersion(ByVal hTapiApp, ByVal i, ByVal minVer, ByVal maxVer, dwAPIVersion, extID)
If lRet Then
Print "Error negotiation API Version: " + Str$(lRet)
End If
lRet = LineOpen (ByVal hTapiApp, ByVal i, hLine, ByVal dwAPIVersion, ByVal 0, ByVal 0, ByVal %LINECALLPRIVILEGE_NONE, ByVal %LINEMEDIAMODE_DATAMODEM, lcParams)
If lRet Then
Print "Error on LineOpen: " + Str$(lRet)
Else
lineNo = i: Exit For
End If
Next i
If lineNo < 0 Then Print "Could not find modem": Exit Function
lineParams.dwTotalSize = SizeOf(LINECALLPARAMS)
lineParams.dwMediaMode = %LINEMEDIAMODE_DATAMODEM
lRet = LineMakeCall (ByVal hLine, hCall, numberToDial, ByVal 0, lineParams)
If lRet < 0 Then
Print "Error making call: " + Str$(lRet): Exit Function
End If
'While PeekMessage(msg, %Null, 0, 0, %PM_REMOVE)
'print hex$(msg.message)
' TranslateMessage(msg)
' DispatchMessage(msg)
'Loop
Print ">>>"
lRet = LineDrop(ByVal hCall, ByVal 0, ByVal 0)
lRet = LineClose(ByVal hLine)
lRet = LineShutdown(ByVal hTapiApp)
End Function
Function TapiCallback(ByVal hDevice&, ByVal dwMsg&, ByVal CBInstance&,_
ByVal Param1&, ByVal Param2&, ByVal Param3&) As Long
Local nDim, dwSize, dwNeed As Dword, sDevice As AsciiZ*16
If dwMsg& = %LINE_REPLY Then
If Param2& < 0 Then
Print "Line Reply Error"
Else
Print "Line Reply Ok"
End If
ElseIf dwMsg& = %LINE_CALLSTATE Then
Select Case Param1&
Case %LINECALLSTATE_IDLE
If hCall <> 0 Then
Print "Line Idle"
End If
Case %LINECALLSTATE_CONNECTED
If hCall <> 0 Then
Print "Connected"
End If
Case %LINECALLSTATE_PROCEEDING
Print "Proceeding"
Case %LINECALLSTATE_DIALING
Print "Dialing..."
Case %LINECALLSTATE_DISCONNECTED
If Param2& = %LINEDISCONNECTMODE_NORMAL Then
Print "Disconnected Normal"
ElseIf Param2& = %LINEDISCONNECTMODE_BUSY Then
Print "Disconnected Busy"
ElseIf Param2& = %LINEDISCONNECTMODE_NODIALTONE Then
Print "No dial tone"
ElseIf Param2& = %LINEDISCONNECTMODE_NOANSWER Then
Print "No Answer"
End If
Case %LINECALLSTATE_BUSY
Print "Line Busy"
End Select
End If
End Function
после LineMakeCall сразуже происходит вызов LineDrop, соответсвенно я никуда не звоню. Если между ними вставить что-то вроде Waitkey$ вызов происходит и завершается после нажатия любой клавиши. Насколько я понял из того что удалось найти - это то, что консольное окно не имеет очереди сообщений (поэтому не происходит вызов callback функции) и нужно копать в сторону peekmessage (или getmessage), но все мои эксперименты потерпели провал.
Подскажите, что нужно сделать чтобы ЭТО начало работать?