Консольная звонилка

Раздел посвящен программированию с использованием Power Basic.
gigamaxx
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 17.10.2007 (Ср) 23:06

Консольная звонилка

Сообщение gigamaxx » 11.03.2013 (Пн) 20:02

Уважаемые форумчане! Нужен совет относительно написания консольной звонилки.

Имеется код с использованием 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), но все мои эксперименты потерпели провал.

Подскажите, что нужно сделать чтобы ЭТО начало работать?

Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList