Bagikan melalui


Mendukung IDispEventImpl

Kelas templat IDispEventImpl dapat digunakan untuk memberikan dukungan untuk sink titik koneksi di kelas ATL Anda. Sink titik koneksi memungkinkan kelas Anda untuk menangani peristiwa yang diaktifkan dari objek COM eksternal. Sink titik koneksi ini dipetakan dengan peta sink peristiwa, yang disediakan oleh kelas Anda.

Untuk menerapkan sink titik koneksi dengan benar untuk kelas Anda, langkah-langkah berikut harus diselesaikan:

  • Mengimpor pustaka jenis untuk setiap objek eksternal

  • Mendeklarasikan IDispEventImpl antarmuka

  • Mendeklarasikan peta sink peristiwa

  • Menyarankan dan membatalkan penambahan titik koneksi

Langkah-langkah yang terlibat dalam menerapkan sink titik koneksi semuanya dicapai dengan memodifikasi hanya file header (.h) kelas Anda.

Mengimpor Pustaka Tipe

Untuk setiap objek eksternal yang peristiwanya ingin Anda tangani, Anda harus mengimpor pustaka jenis. Langkah ini menentukan peristiwa yang dapat ditangani dan menyediakan informasi yang digunakan saat mendeklarasikan peta sink peristiwa. Arahan #import dapat digunakan untuk mencapai hal ini. Tambahkan baris direktif yang diperlukan #import untuk setiap antarmuka pengiriman yang akan Anda dukung ke file header (.h) kelas Anda.

Contoh berikut mengimpor pustaka jenis server COM eksternal (MSCAL.Calendar.7):

#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only

Catatan

Anda harus memiliki pernyataan terpisah #import untuk setiap pustaka jenis eksternal yang akan Anda dukung.

Mendeklarasikan Antarmuka IDispEventImpl

Sekarang setelah Anda mengimpor pustaka jenis dari setiap antarmuka pengiriman, Anda perlu mendeklarasikan antarmuka terpisah IDispEventImpl untuk setiap antarmuka pengiriman eksternal. Ubah deklarasi kelas Anda dengan menambahkan IDispEventImpl deklarasi antarmuka untuk setiap objek eksternal. Untuk informasi selengkapnya tentang parameter, lihat IDispEventImpl.

Kode berikut mendeklarasikan dua sink titik koneksi, untuk DCalendarEvents antarmuka, untuk objek COM yang diterapkan oleh kelas CMyCompositCtrl2:

public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>

Mendeklarasikan Peta Sink Peristiwa

Agar pemberitahuan peristiwa ditangani oleh fungsi yang tepat, kelas Anda harus merutekan setiap peristiwa ke handler yang benar. Ini dicapai dengan mendeklarasikan peta sink peristiwa.

ATL menyediakan beberapa makro, BEGIN_SINK_MAP, END_SINK_MAP, dan SINK_ENTRY_EX, yang membuat pemetaan ini lebih mudah. Format standarnya adalah sebagai berikut:

BEGIN_SINK_MAP(comClass)
  SINK_ENTRY_EX(id, iid, dispid, func)
  . . . //additional external event entries
END_SINK_MAP()

Contoh berikut mendeklarasikan peta sink peristiwa dengan dua penanganan aktivitas:

BEGIN_SINK_MAP(CMyCompositCtrl2)
   //Make sure the Event Handlers have __stdcall calling convention
   SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK, 
      &CMyCompositCtrl2::ClickCalendar1)
   SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK, 
      &CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()

Implementasinya hampir selesai. Langkah terakhir menyangkut saran dan ketidaksadaran antarmuka eksternal.

Memberi saran dan Membuka Antarmuka IDispEventImpl

Langkah terakhir adalah menerapkan metode yang akan menyarankan (atau tidak jelas) semua titik koneksi pada waktu yang tepat. Saran ini harus dilakukan sebelum komunikasi antara klien eksternal dan objek Anda dapat berlangsung. Sebelum objek Anda terlihat, setiap antarmuka pengiriman eksternal yang didukung oleh objek Anda dikueri untuk antarmuka keluar. Koneksi dibuat dan referensi ke antarmuka keluar digunakan untuk menangani peristiwa dari objek. Prosedur ini disebut sebagai "memberi saran."

Setelah objek Anda selesai dengan antarmuka eksternal, antarmuka keluar harus diberi tahu bahwa objek tersebut tidak lagi digunakan oleh kelas Anda. Proses ini disebut sebagai "unadvising."

Karena sifat unik objek COM, prosedur ini bervariasi, secara rinci dan eksekusi, di antara implementasi. Detail ini berada di luar cakupan topik ini dan tidak ditangani.

Lihat juga

Dasar-Dasar Objek ATL COM