Registrieren von Ereignissen

Die folgenden Codebeispiele veranschaulichen die Implementierung eines einfachen Ereignishandlers, die Registrierung der Standard TAPI-Ereignisschnittstelle, das Festlegen des Ereignisfilters und die Registrierung für Anrufbenachrichtigungen.

Der angezeigte Ereignishandler ist ein Beispiel und keine Anforderung. Das primäre Ziel besteht darin, sicherzustellen, dass der Thread, der Ereignisse empfängt, eine minimale Verarbeitung ausführt, bevor Arbeit an einen anderen Thread übergeben wird. Dadurch wird verhindert, dass der Ereignishandler in Situationen mit hoher Ereignislast zu einem Leistungsproblem wird.

Bevor Sie dieses Codebeispiel verwenden, müssen Sie die Vorgänge in Initialize TAPI und Select an Address ausführen.

Hinweis

Dieses Beispiel verfügt nicht über die Fehlerüberprüfung und -releases, die für Produktionscode geeignet sind.

 

//
// 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;
}
//
// Example 2: Register the event interface.
//
long                         gulAdvise;  // Globally declared
IConnectionPointContainer   * pCPC;
IConnectionPoint            * pCP;
IUnknown                    * pUnk;

// Get the connection point container interface pointer from the TAPI object.
hr = gpTapi->QueryInterface(
      IID_IConnectionPointContainer,
      (void **)&pCPC
);
// If ( hr != S_OK O) process the error here. 

// Get the ITTAPIEventNotification interface pointer from the container.
hr = pCPC->FindConnectionPoint(
      IID_ITTAPIEventNotification,
      &pCP
     );
// If ( hr != S_OK O) process the error here. 

pCPC->Release();

// Create a private event notification object.
CTAPIEventNotification* pTapiEventNotification = new CTAPIEventNotification;

hr = pTapiEventNotification->QueryInterface(
      IID_IUnknown,
      (void **)&pUnk
     );
// If ( hr != S_OK O) process the error here. 

// Call the advise method to give TAPI the IUnknown pointer for the event handler.
hr = pCP->Advise(
      pUnk,
      (ULONG *)&gulAdvise
     );
// If ( hr != S_OK O) process the error here. 

pCP->Release();
//
// Example 3: Set the event filter.
//
// Assume we are interested only in call-related events.
hr = gpTapi->put_EventFilter(
    TE_CALLNOTIFICATION | TE_CALLSTATE | TE_CALLMEDIA
    );
// If ( hr != S_OK O) process the error here. 
//
// Example 4: Register an address with TAPI
// for call notifications. Assume we are interested
// in video and audio calls, and that pAddress
// is a pointer to the ITAddress interface of
// an address that can handle both media types.

long glRegister; // Globally declared

hr = gpTapi->RegisterCallNotifications(
      pAddress,
      VARIANT_TRUE,   // monitor privileges
      VARIANT_TRUE,   // owner privileges
      TAPIMEDIATYPE_AUDIO|TAPIMEDIATYPE_VIDEO,
      gulAdvise,      // As returned by Advise
      &glRegister
      );
// If ( hr != S_OK O) process the error here.

ITTAPIEventNotification::Event

TAPI_EVENT

ITTAPI::p ut_EventFilter

TAPIMEDIATYPE_ Konstanten

ITTAPI::RegisterCallNotifications