Peta koneksi
Kontrol OLE dapat mengekspos antarmuka ke aplikasi lain. Antarmuka ini hanya mengizinkan akses dari kontainer ke kontrol tersebut. Jika kontrol OLE ingin mengakses antarmuka eksternal objek OLE lainnya, titik koneksi harus dibuat. Titik koneksi ini memungkinkan akses keluar kontrol ke peta pengiriman eksternal, seperti peta peristiwa atau fungsi pemberitahuan.
Pustaka Kelas Microsoft Foundation menawarkan model pemrograman yang mendukung titik koneksi. Dalam model ini, "peta koneksi" digunakan untuk menunjuk antarmuka atau titik koneksi untuk kontrol OLE. Peta koneksi berisi satu makro untuk setiap titik koneksi. Untuk informasi selengkapnya tentang peta koneksi, lihat CConnectionPoint
kelas .
Biasanya, kontrol hanya mendukung dua titik koneksi: satu untuk peristiwa dan satu untuk pemberitahuan properti. Ini diimplementasikan oleh COleControl
kelas dasar dan tidak memerlukan pekerjaan tambahan oleh penulis kontrol. Titik koneksi lain yang ingin Anda terapkan di kelas Anda harus ditambahkan secara manual. Untuk mendukung peta koneksi dan titik, MFC menyediakan makro berikut:
Nama | Deskripsi |
---|---|
BEGIN_CONNECTION_PART |
Menyatakan kelas tersemat yang mengimplementasikan titik koneksi tambahan (harus digunakan dalam deklarasi kelas). |
END_CONNECTION_PART |
Mengakhiri deklarasi titik koneksi (harus digunakan dalam deklarasi kelas). |
CONNECTION_IID |
Menentukan ID antarmuka titik koneksi kontrol. |
DECLARE_CONNECTION_MAP |
Menyatakan bahwa peta koneksi akan digunakan dalam kelas (harus digunakan dalam deklarasi kelas). |
BEGIN_CONNECTION_MAP |
Memulai definisi peta koneksi (harus digunakan dalam implementasi kelas). |
END_CONNECTION_MAP |
Mengakhiri definisi peta koneksi (harus digunakan dalam implementasi kelas). |
CONNECTION_PART |
Menentukan titik koneksi dalam peta koneksi kontrol. |
Fungsi berikut membantu sink dalam membangun dan memutuskan koneksi menggunakan titik koneksi:
Nama | Deskripsi |
---|---|
AfxConnectionAdvise |
Membuat koneksi antara sumber dan sink. |
AfxConnectionUnadvise |
Memutuskan koneksi antara sumber dan sink. |
BEGIN_CONNECTION_PART
Gunakan makro untuk memulai definisi titik koneksi tambahan di luar titik koneksi pemberitahuan peristiwa dan properti.
BEGIN_CONNECTION_PART(theClass, localClass)
theClass
Menentukan nama kelas kontrol yang titik koneksinya ini.
localClass
Menentukan nama kelas lokal yang mengimplementasikan titik koneksi.
Dalam file deklarasi (.h
) yang menentukan fungsi anggota untuk kelas Anda, mulai titik koneksi dengan BEGIN_CONNECTION_PART
makro. Kemudian tambahkan CONNECTION_IID
makro dan fungsi anggota lain yang ingin Anda terapkan. Terakhir, selesaikan peta titik koneksi dengan END_CONNECTION_PART
makro.
Header afxdisp.h
Mengakhiri deklarasi titik koneksi Anda.
END_CONNECTION_PART(localClass)
localClass
Menentukan nama kelas lokal yang mengimplementasikan titik koneksi.
Header afxdisp.h
Gunakan antara BEGIN_CONNECTION_PART
makro dan END_CONNECTION_PART
untuk menentukan ID antarmuka untuk titik koneksi yang didukung oleh kontrol OLE Anda.
CONNECTION_IID(iid)
iid
ID antarmuka antarmuka yang dipanggil oleh titik koneksi.
Argumen iid
adalah ID antarmuka yang digunakan untuk mengidentifikasi antarmuka yang dipanggil titik koneksi pada sink yang terhubung. Contohnya:
CONNECTION_IID(IID_ISampleSink)
Menentukan titik koneksi yang memanggil ISinkInterface
antarmuka.
Header afxdisp.h
Setiap COleControl
kelas turunan dalam program Anda dapat menyediakan peta koneksi untuk menentukan titik koneksi tambahan yang didukung kontrol Anda.
DECLARE_CONNECTION_MAP()
Jika kontrol Anda mendukung titik tambahan, gunakan DECLARE_CONNECTION_MAP
makro di akhir deklarasi kelas Anda. Kemudian, dalam file .cpp yang menentukan fungsi anggota untuk kelas, gunakan BEGIN_CONNECTION_MAP
makro, CONNECTION_PART
makro untuk setiap titik koneksi kontrol, dan END_CONNECTION_MAP
makro untuk mendeklarasikan akhir peta koneksi.
Header afxdisp.h
Setiap COleControl
kelas turunan dalam program Anda dapat menyediakan peta koneksi untuk menentukan titik koneksi yang akan didukung kontrol Anda.
BEGIN_CONNECTION_MAP(theClass, theBase)
theClass
Menentukan nama kelas kontrol yang peta koneksinya.
theBase
Menentukan nama kelas theClass
dasar .
Dalam file implementasi (.CPP
) yang menentukan fungsi anggota untuk kelas Anda, mulai peta koneksi dengan BEGIN_CONNECTION_MAP
makro, lalu tambahkan entri makro untuk setiap titik koneksi Anda menggunakan CONNECTION_PART
makro. Terakhir, selesaikan peta koneksi dengan END_CONNECTION_MAP
makro.
Header afxdisp.h
Mengakhiri definisi peta koneksi Anda.
END_CONNECTION_MAP()
Header afxdisp.h
Memetakan titik koneksi untuk kontrol OLE Anda ke ID antarmuka tertentu.
CONNECTION_PART(theClass, iid, localClass)
theClass
Menentukan nama kelas kontrol yang titik koneksinya ini.
iid
ID antarmuka antarmuka yang dipanggil oleh titik koneksi.
localClass
Menentukan nama kelas lokal yang mengimplementasikan titik koneksi.
Contohnya:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
mengimplementasikan peta koneksi, dengan titik koneksi, yang memanggil IID_ISinkInterface
antarmuka.
Header afxdisp.h
Panggil fungsi ini untuk membuat koneksi antara sumber, yang ditentukan oleh pUnkSrc
, dan sink, yang ditentukan oleh pUnkSink
.
BOOL AFXAPI AfxConnectionAdvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD FAR* pdwCookie);
pUnkSrc
Penunjuk ke objek yang memanggil antarmuka.
pUnkSink
Penunjuk ke objek yang mengimplementasikan antarmuka.
iid
ID antarmuka koneksi.
bRefCount
Untuk koneksi di luar proses, parameter ini harus TRUE
, dan menunjukkan bahwa membuat koneksi harus menyebabkan jumlah pUnkSink
referensi bertambah.
Untuk koneksi dalam proses, TRUE
menunjukkan bahwa membuat koneksi harus menyebabkan jumlah pUnkSink
referensi bertambah. FALSE
menunjukkan bahwa jumlah referensi tidak boleh bertambah.
Peringatan: Secara umum, tidak dapat diprediksi koneksi mana yang sedang dalam proses dan koneksi mana yang di luar proses, sehingga disarankan untuk selalu mengatur parameter ini ke TRUE
.
pdwCookie
Penunjuk ke DWORD
tempat pengidentifikasi koneksi dikembalikan. Nilai ini harus diteruskan sebagai dwCookie
parameter ke AfxConnectionUnadvise
saat memutuskan koneksi.
Bukan nol jika koneksi dibuat; jika tidak, 0.
//CMySink is a CCmdTarget-derived class supporting automation.
//Instantiate the sink class.
CMySink mysink;
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Establish a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a cookie identifying the connection, and is needed
//to terminate this connection.
AfxConnectionAdvise(pUnkSrc, IID_ISampleSink, pUnkSink, TRUE, &dwCookie);
Header: afxctl.h
Panggil fungsi ini untuk memutuskan koneksi antara sumber, yang ditentukan oleh pUnkSrc
, dan sink, yang ditentukan oleh pUnkSink
.
BOOL AFXAPI AfxConnectionUnadvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD dwCookie);
pUnkSrc
Penunjuk ke objek yang memanggil antarmuka.
pUnkSink
Penunjuk ke objek yang mengimplementasikan antarmuka.
iid
ID antarmuka antarmuka titik koneksi.
bRefCount
Untuk koneksi di luar proses, parameter ini harus TRUE
, dan menunjukkan bahwa membuat koneksi harus menyebabkan jumlah pUnkSink
referensi dikurangi.
Untuk koneksi dalam proses, TRUE
menunjukkan bahwa membuat koneksi harus menyebabkan jumlah pUnkSink
referensi dikurangi. FALSE
menunjukkan bahwa jumlah referensi tidak boleh direkrementasikan.
Peringatan: Secara umum, tidak dapat diprediksi koneksi mana yang sedang dalam proses dan koneksi mana yang di luar proses, sehingga disarankan untuk selalu mengatur parameter ini ke TRUE
.
dwCookie
Pengidentifikasi koneksi dikembalikan oleh AfxConnectionAdvise
.
Bukan nol jika koneksi terputus; jika tidak, 0.
//mysink is a CCmdTarget-derived class supporting automation.
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Terminate a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a value obtained through AfxConnectionAdvise().
AfxConnectionUnadvise(pUnkSrc, IID_ISampleSink, pUnkSink, TRUE, dwCookie);
Header: afxctl.h