Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Im Folgenden sind Hinweise und Tipps aufgeführt, die Sie beim Schreiben einer Anwendung für TAPI 3 berücksichtigen sollten:
COM CoInitialize indirekt Fenster erstellt; Dies ist besonders wichtig für Apartmentthreading. Wenn ein Thread Fenster erstellt, muss er Nachrichten verarbeiten. Wenn Ihre Threads CoInitializeaufrufen, führen Sie eine Nachrichtenpumpe aus, um Probleme zu vermeiden. Beispielsweise kann COM die ordnungsgemäße Marshallung beenden oder Methoden auf COM-Schnittstellen wie IGlobalInterfaceTable hängen.
In Apartmentthreading müssen Sie über eine Nachrichtenpumpe verfügen, unabhängig davon, ob Sie auf Synchronisierungsobjekte warten. Dies ist besonders wichtig, wenn Sie über eine Konsolenanwendung verfügen oder ein LOKALEs/Remoteserverobjekt schreiben, das apartmentthreads ist (wenn Sie keine Konsole oder eine GUI haben, aber das Steuerelement nur im System ausgeführt wird).
Vorsicht
Beim Aufrufen der Warte- und Synchronisierungsfunktionen wie Sleep, WaitForMultipleObjects, WaitForMultipleObjectsEx, WaitForSingleObject, WaitForSingleObjectExusw. Verwenden Sie stattdessen MsgWaitForMultipleObjects und verarbeiten Sie die Nachrichten, oder verwenden Sie CoWaitForMultipleHandles, wodurch automatisch erkannt wird, in welchem Apartmenttyp sich der Thread befindet (STA oder MTA), und wartet entweder in einer MODalschleife (wenn STA) oder in WaitForMultipleObjects (wenn MTA). MsgWaitForMultipleObjects und CoWaitForMultipleHandles auch Fenstermeldungen gemäß den COM-Regeln verarbeiten.
Beispiel:
Sleep (5000);Gebrauchen:
{ DWORD dwSignalled; HANDLE heventDone = CreateEvent(0, FALSE, FALSE, 0); CoWaitForMultipleHandles (COWAIT_ALERTABLE, 5000, 1, &heventDone, &dwSignalled); CloseHandle(heventDone); }ITTAPIEventNotification::Event ist die App-Ereignisfunktion, die für einen TAPI 3-Rückrufthread aufgerufen wird.
Führen Sie das Minimum in der Ereignisroutine durch; Verwenden Sie stattdessen nach Möglichkeit Ihren eigenen Thread.
Beachten Sie, dass das folgende Codebeispiel bereitgestellt wird, aber keine Anforderung ist.
#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; }Bearbeiten Sie COM-Objekte nicht, nachdem sie CoUninitialize-aufgerufen haben. Die Ergebnisse sind unvorhersehbar und nachteilig für eine gesunde Anwendung. Einige Beispiele, in denen dies passieren kann, sind Arbeitsthreads und C++-Destruktoren, die nach einem Aufruf einer Anwendung CoUninitializeausgeführt werden können.