Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Di seguito sono riportati suggerimenti e suggerimenti da considerare per la scrittura di un'applicazione per TAPI 3:
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); }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; }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.