Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Programowanie telefonii TAPI

Ostatnio zmodyfikowano 2012-11-13 16:18
Autor Wiadomość
dormar
Temat założony przez niniejszego użytkownika
Programowanie telefonii TAPI
» 2012-11-12 17:56:38
Witam

Programuję współpracę pomiędzy komputerem a cyfrową centralą telefoniczną.
Mam napisany i działający fragment programu, który realizuję funkcję dzwonienia, tj.:

C/C++
#include "stdafx.h"
#include "windows.h"
#include "tapi3.h"

int _tmain( int argc, _TCHAR * argv[] )
{
    int a = 0;
    char b;
   
    IEnumAddress * pIEnumAddress;
    ITAddress * pAddress;
    ITMediaSupport * pMediaSupport;
    ITBasicCallControl * pBasicCall;
   
    long lMediaTypes;
    short bSupport;
    BSTR adres, Addr;
    BSTR callerNumber;
    BSTR model = L"PPTP";
   
    ITCallStateEvent * pNotify;
   
   
    HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
   
    ITTAPI * gpTapi;
   
    hr = CoCreateInstance( CLSID_TAPI, NULL, CLSCTX_INPROC_SERVER, IID_ITTAPI,( LPVOID * ) & gpTapi );
   
   
    if( FAILED( hr ) )
    {
        MessageBox( NULL, TEXT( "test1" ), TEXT( "Bar" ), 0 );
        return hr;
    }
   
    hr = gpTapi->Initialize();
   
    hr = gpTapi->EnumerateAddresses( & pIEnumAddress );
   
    while( S_OK == pIEnumAddress->Next( 1, & pAddress, NULL ) )
    {
       
       
        a++;
       
        hr = pAddress->get_AddressName( & adres );
       
        if( 0 == wcscmp( adres, model ) ) {
            //MessageBox(NULL, adres, TEXT("Bar"), 0);
            break;
        }
       
    }
   
    hr = pAddress->CreateCall( L"130", LINEADDRESSTYPE_PHONENUMBER, LINEMEDIAMODE_INTERACTIVEVOICE, & pBasicCall );
    pBasicCall->Connect( true );
   
   
    return 0;
}

Kolejnym elementem programu ma być odczytanie numeru telefonu dzwoniącego CallerId.
Powinno to chyba wyglądać mniej więcej tak (fragment):

C/C++
ITCallStateEvent * pNotify;
CALL_STATE state;
ITAddress * pAddress;
_bstr_t callerNumber;

pEvent->QueryInterface( IID_ITCallStateEvent,( void ** ) & pNotify );
pNotify->get_Call( & pCallInfo );
pCallInfo->get_CallInfoString( CIS_CALLERIDNUMBER,
callerNumber.GetAddress() );

I tutaj mam problem związany ze zmienną pEvent. Pod tym linkiem http://msdn.microsoft.com/en-us/library/windows/desktop/ms734177(v=vs.85).aspx podany jest sposób zarejestrowania Event. Proszę o poradę jak to wszystko połączyć do kupy.

Pozdrawiam
P-69044
DejaVu
» 2012-11-12 21:02:21
W linku który podałeś masz fragmenty kodów odpowiedzialnych za zrobienie 'różnych' rzeczy... nawet masz tematycznie podzielone przykłady w drzewku po lewej.
P-69072
dormar
Temat założony przez niniejszego użytkownika
» 2012-11-12 22:09:17
Wiem, że to jest w  tym linku i dlatego zrobiłem tak: (wg drzewka po lewej)
1. Initialize Tapi
2. Select an Address - tutaj wybieram zainstalowany driver dla mojej centrali
3. Make a Call - wykonanie połączenie na wskazany numer
i to mi działa.

chodzi o to, że teraz potrzebuję zidentyfikować numer dzwoniącego i wychodzi mi na to, że trzeba to zrobić tak:
1. Initialize tapi
2. Select an adres
3. Register Events - i tutaj mam problem, jak to wkomponować w ten mój program. Podane na stronie z linku są 4 przykłady (czy bardziej kolejne kroki do wykonania?). Nie wiem własnie jak tego użyć dla moich potrzeb, czyli jak zarejestrować ten Even, aby mozna było go użyć np. w ten sposób: pEvent->QueryInterface( IID_ITCallStateEvent,( void ** ) & pNotify );

Pozdrawiam
P-69088
DejaVu
» 2012-11-13 05:12:26
Kody przedstawiają różne etapy rejestrowania zdarzenia.
P-69100
dormar
Temat założony przez niniejszego użytkownika
» 2012-11-13 06:41:13
Example 2, Example 3 i Example4 wstawiam do mojego kodu po Initialize TAPI i Select an Address. Wtedy powinienem mieć zarejestrowane i (przechwycone) zdarzenie pEvent, które wykorzystam do dolszego programowania, już konkretnie odczytu numeru dzwoniącego. Dobrze myslę?

Natomiast nie wiem gdzie i jak umieścić kod zawarty w Example 1, czyli wychodzi na to, że nie wiem jak w Visual Studio 2010 C++ zrobić obsługę zdarzeń (event handler).


chodzi o ten fragment

C/C++
//
// Example 1: Implement a simple event handler.
//
HRESULT STDMETHODCALLTYPE
CTAPIEventNotification::Event(
TAPI_EVENT TapiEvent,
IDispatch * pEvent
)
{
    // AddRef the event so it does not go away.
    pEvent->AddRef();
   
    // Post a message to our own UI thread.
    BOOL bMessage;
    bMessage = PostMessage(
    ghDlg,
    WM_PRIVATETAPIEVENT,
    ( WPARAM ) TapiEvent,
    ( LPARAM ) pEvent
    );
    // If (bMessage == 0) process the error here.
    return S_OK;
}

Pozdrawiam
P-69102
DejaVu
» 2012-11-13 16:18:52
Musisz utworzyć klasę CTAPIEventNotification, która dziedziczy z jakiejś istniejącej klasy/interfejsu. Z czego dokładnie - trzeba doczytać w dokumentacji.

/edit:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms732506(v=vs.85).aspx

Frazy, które należy wpisać w wyszukiwarkę google:

/edit2:
http://www.codeforge.com/read/134270/Callnot.h__html

W każdym razie nie masz lekkiego zadania :P
P-69118
« 1 »
  Strona 1 z 1