Bağlantı Noktaları
Bu makalede, ve MFC sınıflarını CCmdTarget
CConnectionPoint
kullanarak bağlantı noktalarının (eski adı OLE bağlantı noktaları) nasıl uygulanacakları açıklanmaktadır.
Geçmişte Bileşen Nesne Modeli (COM), nesnelerin arabirimlerde işlevsellik uygulamasına ve kullanıma sunmasına izin veren genel bir mekanizma (IUnknown::QueryInterface
*) tanımlamıştı. Ancak, nesnelerin belirli arabirimleri çağırma yeteneklerini kullanıma sunmalarına izin veren ilgili bir mekanizma tanımlanmadı. Diğer bir deyişle, COM nesnelere gelen işaretçilerin (bu nesnenin arabirimlerine yönelik işaretçiler) nasıl işlendiğini tanımladı, ancak giden arabirimler için açık bir modele sahip değildi (nesnenin diğer nesnelerin arabirimlerine tutan işaretçiler). COM artık bu işlevselliği destekleyen bağlantı noktaları olarak adlandırılan bir modele sahiptir.
Bir bağlantının iki bölümü vardır: kaynak olarak adlandırılan arabirimi çağıran nesne ve havuzu olarak adlandırılan arabirimi uygulayan nesne. Bağlantı noktası, kaynak tarafından kullanıma sunulan arabirimdir. Kaynak, bir bağlantı noktasını ortaya çıkartarak havuzların kendisine (kaynak) bağlantı kurmasına olanak tanır. Bağlantı noktası mekanizması ( IConnectionPoint
arabirim) aracılığıyla, havuz arabirimine bir işaretçi kaynak nesneye geçirilir. Bu işaretçi, kaynağa havuzun bir üye işlevleri kümesi uygulamasına erişim sağlar. Örneğin, havuz tarafından uygulanan bir olayı tetiklerken kaynak, havuz uygulamasının uygun yöntemini çağırabilir. Aşağıdaki şekilde, az önce açıklanan bağlantı noktası gösterilmektedir.
Uygulanan Bağlan Noktası
MFC bu modeli C Bağlan ionPoint ve CCmdTarget sınıflarında uygular. arabiriminden CConnectionPoint
IConnectionPoint
türetilen sınıflar, bağlantı noktalarını diğer nesnelere göstermek için kullanılır. 'den CCmdTarget
türetilen sınıflar, bir nesnenin IConnectionPointContainer
tüm kullanılabilir bağlantı noktalarını numaralandırabilen veya belirli bir bağlantı noktasını bulabilen arabirimini uygular.
Sınıfınızda uygulanan her bağlantı noktası için, bağlantı noktasını uygulayan bir bağlantı bölümü bildirmeniz gerekir. Bir veya daha fazla bağlantı noktası uygularsanız, sınıfınızda tek bir bağlantı eşlemesi de bildirmeniz gerekir. Bağlantı eşlemesi, ActiveX denetimi tarafından desteklenen bağlantı noktaları tablosudur.
Aşağıdaki örneklerde basit bir bağlantı eşlemesi ve bir bağlantı noktası gösterilmektedir. İlk örnek bağlantı eşlemesini ve noktasını bildirir; İkinci örnek haritayı ve noktayı uygular. CMyClass
Türetilmiş bir CCmdTarget
sınıf olması gerektiğini unutmayın. İlk örnekte kod, sınıf bildirimine şu bölümün protected
altına eklenir:
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()
BEGIN_CONNECTION_PART ve END_CONNECTION_PART makroları, XSampleConnPt
bu belirli bağlantı noktasını uygulayan bir katıştırılmış sınıf ('dan CConnectionPoint
türetilir) bildirir. Herhangi bir CConnectionPoint
üye işlevini geçersiz kılmak veya kendi üye işlevlerinizi eklemek istiyorsanız, bunları bu iki makro arasında bildirin. Örneğin, makro bu CONNECTION_IID
iki makro arasına CConnectionPoint::GetIID
yerleştirildiğinde üye işlevini geçersiz kılar.
İkinci örnekte, denetimin uygulama dosyasına (.cpp dosyası) kod eklenir. Bu kod, bağlantı noktasını SampleConnPt
içeren bağlantı eşlemesini uygular:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
Sınıfınızda birden fazla bağlantı noktası varsa, BEGIN_CONNECTION_MAP ve END_CONNECTION_MAP makroları arasına ek CONNECTION_PART makrolar ekleyin.
Son olarak, sınıfın oluşturucusunda öğesine EnableConnections
bir çağrı ekleyin. Örnek:
CMyClass::CMyClass()
{
EnableConnections();
}
Bu kod eklendikten sonra türetilmiş sınıfınız CCmdTarget
arabirim için ISampleSink
bir bağlantı noktası gösterir. Aşağıdaki şekilde bu örnek gösterilmiştir.
MFC ile Uygulanan bir Bağlan Noktası
Bağlantı noktaları genellikle "çok noktaya yayın" özelliğini destekler; aynı arabirime bağlı birden çok havuza yayın yapabilme özelliği. Aşağıdaki örnek parça, bir bağlantı noktasındaki her havuz arasında yineleme yaparak çok noktaya yayının nasıl yapılacağını gösterir:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink* pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
pSampleSink->SinkFunc();
}
}
Bu örnek, bağlantı CConnectionPoint::GetConnections
noktasında çağrısıyla SampleConnPt
geçerli bağlantı kümesini alır. Ardından bağlantılar üzerinden yinelenir ve her etkin bağlantıda çağrılar ISampleSink::SinkFunc
olur.