Suggerimenti e suggerimenti

Di seguito sono riportati suggerimenti e suggerimenti da considerare per la scrittura di un'applicazione per TAPI 3:

  1. COM CoInitialize crea indirettamente finestre; questo è particolarmente importante per il threading apartment. Se un thread crea finestre, deve elaborare i messaggi. Se i thread chiamano CoInitialize, eseguire un message pump per evitare problemi. Ad esempio, COM potrebbe interrompere correttamente il marshalling o metodi sulle interfacce COM, ad esempio IGlobalInterfaceTable potrebbe bloccarsi.

    Nel threading apartment è necessario disporre di un pump di messaggi indipendentemente dal fatto che si attenda o meno gli oggetti di sincronizzazione. Ciò è particolarmente importante se si dispone di un'applicazione console o si scrive un oggetto server locale/remoto COM threaded (in cui non si dispone di una console o di un'interfaccia utente grafica, ma il controllo è semplicemente "eseguito" nel sistema).

    Cautela

    Quando si chiamano le funzioni di attesa e sincronizzazione, ad esempio Sospensione, WaitForMultipleObjects, WaitForMultipleObjectsEx, WaitForSingleObject, WaitForSingleObjectExe così via. Usare invece MsgWaitForMultipleObjects ed elaborare i messaggi oppure usare CoWaitForMultipleHandles, che rileverà automaticamente il tipo di apartment in cui si trova il thread (STA o MTA) e attenderà un ciclo modale COM (se STA) o un blocco in WaitForMultipleObjects (se MTA). MsgWaitForMultipleObjects e CoWaitForMultipleHandles elaborare anche i messaggi di Windows in base alle regole COM.

     

    Ad esempio, anziché:

    Sleep (5000);

    Usare:

     {
       DWORD dwSignalled;
       HANDLE heventDone = CreateEvent(0, FALSE, FALSE, 0);
    
       CoWaitForMultipleHandles (COWAIT_ALERTABLE,
                             5000,
                             1,
                             &heventDone,
                             &dwSignalled);
    
       CloseHandle(heventDone);
     }
    
  2. ITTAPIEventNotification::Event è la funzione event delle app chiamata su un thread di callback TAPI 3.

    Fare il minimo nella routine Event; Usare invece il proprio thread, dove possibile.

    Tenere presente che viene fornito l'esempio di codice seguente, ma non è un requisito.

    #include <windows.h>
    
    HRESULT
    STDMETHODCALLTYPE
    CTAPIEventNotification::Event(
        TAPI_EVENT TapiEvent,
        IDispatch *pEvent)
    {
        //
        // Addref the event so that it does not go away.
        //
        pEvent->AddRef();
    
        //
        // Post a message for reference.
        //
        BOOL RetVal = PostMessage(
                                  ghDlg,
                                  WM_PRIVATETAPIEVENT,
                                  (WPARAM) TapiEvent,
                                  (LPARAM) pEvent
                                  );
    
        // If (RetVal == 0 ) process error here.
    
        return S_OK;
    }     
    
  3. Non modificare gli oggetti COM dopo aver chiamato CoUninitialize. I risultati sono imprevedibili e dannosi per un'applicazione integra. Alcuni esempi in cui ciò può verificarsi sono i thread di lavoro e i distruttori C++ che possono essere eseguiti dopo che un'applicazione chiama CoUninitialize.