Bagikan melalui


Titik Koneksi

Artikel ini menjelaskan cara menerapkan titik koneksi (sebelumnya dikenal sebagai titik koneksi OLE) menggunakan kelas CCmdTarget MFC dan CConnectionPoint.

Di masa lalu, Model Objek Komponen (COM) mendefinisikan mekanisme umum (IUnknown::QueryInterface*) yang memungkinkan objek untuk menerapkan dan mengekspos fungsionalitas dalam antarmuka. Namun, mekanisme yang sesuai yang memungkinkan objek untuk mengekspos kemampuannya untuk memanggil antarmuka tertentu tidak ditentukan. Artinya, COM mendefinisikan bagaimana penunjuk masuk ke objek (penunjuk ke antarmuka objek itu) ditangani, tetapi tidak memiliki model eksplisit untuk antarmuka keluar (mengarahkan objek ke antarmuka objek lain). COM sekarang memiliki model, yang disebut titik koneksi, yang mendukung fungsionalitas ini.

Koneksi memiliki dua bagian: objek yang memanggil antarmuka, yang disebut sumber, dan objek yang mengimplementasikan antarmuka, yang disebut sink. Titik koneksi adalah antarmuka yang diekspos oleh sumber. Dengan mengekspos titik koneksi, sumber memungkinkan sink untuk membuat koneksi ke dirinya sendiri (sumbernya). Melalui mekanisme titik koneksi ( IConnectionPoint antarmuka), penunjuk ke antarmuka sink diteruskan ke objek sumber. Penunjuk ini menyediakan sumber dengan akses ke implementasi sink dari sekumpulan fungsi anggota. Misalnya, untuk mengaktifkan peristiwa yang diterapkan oleh sink, sumber dapat memanggil metode implementasi sink yang sesuai. Gambar berikut menunjukkan titik koneksi yang baru saja dijelaskan.

Diagram showing an implemented connection point.
Titik Koneksi yang Diimplementasikan

MFC mengimplementasikan model ini di kelas C Koneksi ionPoint dan CCmdTarget. Kelas yang berasal dari CConnectionPoint mengimplementasikan IConnectionPoint antarmuka, digunakan untuk mengekspos titik koneksi ke objek lain. Kelas yang berasal dari CCmdTarget mengimplementasikan IConnectionPointContainer antarmuka, yang dapat menghitung semua titik koneksi objek yang tersedia atau menemukan titik koneksi tertentu.

Untuk setiap titik koneksi yang diterapkan di kelas Anda, Anda harus mendeklarasikan bagian koneksi yang mengimplementasikan titik koneksi. Jika Anda menerapkan satu atau beberapa titik koneksi, Anda juga harus mendeklarasikan satu peta koneksi di kelas Anda. Peta koneksi adalah tabel titik koneksi yang didukung oleh kontrol ActiveX.

Contoh berikut menunjukkan peta koneksi sederhana dan satu titik koneksi. Contoh pertama mendeklarasikan peta koneksi dan titik; contoh kedua mengimplementasikan peta dan titik. Perhatikan bahwa CMyClass harus kelas CCmdTarget-turunan. Dalam contoh pertama, kode disisipkan dalam deklarasi kelas, di bawah bagian protected :

class CMyClass : public CCmdTarget
{
protected:
   // Connection point for ISample interface
   BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
      CONNECTION_IID(IID_ISampleSink)
   END_CONNECTION_PART(SampleConnPt)

   DECLARE_CONNECTION_MAP()

Makro BEGIN_CONNECTION_PART dan END_CONNECTION_PART mendeklarasikan kelas tersemat, XSampleConnPt (berasal dari CConnectionPoint), yang mengimplementasikan titik koneksi khusus ini. Jika Anda ingin mengambil alih fungsi anggota apa pun CConnectionPoint atau menambahkan fungsi anggota Anda sendiri, nyatakan di antara kedua makro ini. Misalnya, CONNECTION_IID makro mengambil alih CConnectionPoint::GetIID fungsi anggota saat ditempatkan di antara kedua makro ini.

Dalam contoh kedua, kode disisipkan dalam file implementasi kontrol (file.cpp). Kode ini mengimplementasikan peta koneksi, yang mencakup titik koneksi, SampleConnPt:

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

Jika kelas Anda memiliki lebih dari satu titik koneksi, sisipkan makro CONNECTION_PART tambahan antara makro BEGIN_CONNECTION_MAP dan END_CONNECTION_MAP.

Terakhir, tambahkan panggilan ke EnableConnections di konstruktor kelas. Contohnya:

CMyClass::CMyClass()
{
   EnableConnections();
}

Setelah kode ini dimasukkan, kelas -turunan Anda CCmdTargetmengekspos titik koneksi untuk ISampleSink antarmuka. Gambar berikut mengilustrasikan contoh ini.

Diagram showing a Connection point implemented by using MFC.
Titik Koneksi diimplementasikan dengan MFC

Biasanya, titik koneksi mendukung "multicasting" — kemampuan untuk menyiarkan ke beberapa sink yang terhubung ke antarmuka yang sama. Contoh fragmen berikut menunjukkan cara melakukan multicast dengan melakukan iterasi melalui setiap sink pada titik koneksi:

void CMyClass::CallSinkFunc()
{
   POSITION pos = m_xSampleConnPt.GetStartPosition();
   ISampleSink* pSampleSink;
   while (pos != NULL)
   {
      pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
      if (pSampleSink != NULL)
         pSampleSink->SinkFunc();
   }
}

Contoh ini mengambil kumpulan koneksi saat ini pada SampleConnPt titik koneksi dengan panggilan ke CConnectionPoint::GetConnections. Kemudian iterasi melalui koneksi dan panggilan ISampleSink::SinkFunc pada setiap koneksi aktif.

Baca juga

MFC COM