Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berikut ini adalah petunjuk dan tips yang perlu dipertimbangkan saat menulis aplikasi untuk TAPI 3:
COM CoInitialize secara tidak langsung membuat jendela; ini sangat penting untuk utas apartemen. Jika utas membuat jendela apa pun, utas harus memproses pesan. Jika utas Anda memanggil CoInitialize, jalankan pompa pesan untuk mencegah masalah. Misalnya, COM mungkin berhenti melakukan marshalling dengan benar, atau metode pada antarmuka COM, seperti IGlobalInterfaceTable mungkin macet.
Di utas apartemen Anda harus memiliki pompa pesan terlepas dari apakah Anda menunggu objek sinkronisasi. Ini sangat penting jika Anda memiliki aplikasi konsol atau Anda menulis objek server lokal/jarak jauh COM yang berulir apartemen (di mana Anda tidak memiliki konsol atau GUI, tetapi kontrol hanya "berjalan" dalam sistem).
Hati
Saat memanggil fungsi tunggu dan sinkronisasi, seperti Sleep, WaitForMultipleObjects, WaitForMultipleObjectsEx, WaitForSingleObject, WaitForSingleObjectEx, dan sebagainya. Sebagai gantinya, gunakan MsgWaitForMultipleObjects dan memproses pesan, atau menggunakan CoWaitForMultipleHandles, yang akan secara otomatis mendeteksi jenis apartemen tempat utas berada (STA atau MTA) dan akan menunggu baik dalam perulangan modal COM (jika STA) atau blok pada WaitForMultipleObjects (jika MTA). MsgWaitForMultipleObjects dan CoWaitForMultipleHandles juga memproses pesan windows sesuai dengan aturan COM.
Misalnya, alih-alih:
Sleep (5000);
Pakai:
{ DWORD dwSignalled; HANDLE heventDone = CreateEvent(0, FALSE, FALSE, 0); CoWaitForMultipleHandles (COWAIT_ALERTABLE, 5000, 1, &heventDone, &dwSignalled); CloseHandle(heventDone); }
ITTAPIEventNotification::Event adalah fungsi Peristiwa aplikasi yang dipanggil pada utas panggilan balik TAPI 3.
Lakukan minimum dalam rutinitas Peristiwa; sebagai gantinya, gunakan utas Anda sendiri jika memungkinkan.
Ketahuilah bahwa contoh kode berikut disediakan, tetapi bukan persyaratan.
#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; }
Jangan memanipulasi objek COM setelah memanggil CoUninitialize. Hasilnya tidak dapat diprediksi dan merugikan aplikasi yang sehat. Beberapa contoh di mana ini dapat terjadi adalah utas pekerja dan destruktor C++ yang dapat dijalankan setelah panggilan aplikasi CoUninitialize.