Sdílet prostřednictvím


Spojovací body

Tento článek vysvětluje, jak implementovat spojovací body (dříve označované jako spojovací body OLE) pomocí tříd CCmdTarget MFC a CConnectionPoint.

V minulosti model COM (Component Object Model) definoval obecný mechanismus (IUnknown::QueryInterface*), který umožnil objektům implementovat a zveřejnit funkce v rozhraních. Nebyl však definován odpovídající mechanismus, který umožňoval objektům zveřejnit jejich schopnost volat konkrétní rozhraní. To znamená, že objekt COM definoval způsob zpracování příchozích ukazatelů na objekty (ukazatele na rozhraní daného objektu), ale neměl explicitní model pro odchozí rozhraní (ukazatele, které objekt uchovává na rozhraní jiných objektů). Com teď má model označovaný jako spojovací body, který tuto funkci podporuje.

Připojení má dvě části: objekt volající rozhraní, označovaný jako zdroj, a objekt, který implementuje rozhraní, označovaný jako jímka. Spojovací bod je rozhraní vystavené zdrojem. Zveřejněním spojovacího bodu zdroj umožňuje jímce navázat připojení k sobě (zdroj). Prostřednictvím mechanismu spojovacího bodu (rozhraní IConnectionPoint) se do zdrojového objektu předá ukazatel na vstupní rozhraní. Tento ukazatel poskytuje zdroji přístup k implementaci sady členských funkcí jímky. Pokud například chcete aktivovat událost implementovanou jímkou, zdroj může volat příslušnou metodu implementace jímky. Následující obrázek znázorňuje právě popsaný spojovací bod.

Diagram znázorňující implementovaný spojovací bod
Implementovaný spojovací bod

MFC implementuje tento model do tříd CConnectionPoint a CCmdTarget . Třídy odvozené z CConnectionPoint implementují rozhraní IConnectionPoint, které se používá k vystavení spojovacích bodů jiným objektům. Třídy odvozené z CCmdTarget implementují IConnectionPointContainer rozhraní, které mohou enumerovat všechny dostupné spojovací body objektu nebo najít konkrétní spojovací bod.

Pro každý spojovací bod implementovaný ve vaší třídě musíte deklarovat část připojení, která implementuje spojovací bod. Pokud implementujete jeden nebo více spojovacích bodů, musíte ve své třídě deklarovat také jednu mapu připojení. Mapa připojení je tabulka spojovacích bodů podporovaných ovládacím prvku ActiveX.

Následující příklady ukazují jednoduchou mapu připojení a jeden spojovací bod. První příklad deklaruje mapování připojení a bod; druhý příklad implementuje mapu a bod. Všimněte si, že CMyClass musí být třídou odvozenou z CCmdTarget. V prvním příkladu se kód vloží do deklarace třídy v protected části:

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()

Makra BEGIN_CONNECTION_PART a END_CONNECTION_PART deklarují vloženou třídu XSampleConnPt (odvozenou z CConnectionPoint), která implementuje tento konkrétní spojovací bod. Pokud chcete přepsat všechny CConnectionPoint členské funkce nebo přidat vlastní členské funkce, deklarujte je mezi těmito dvěma makry. Makro například CONNECTION_IID přepíše členskou funkci CConnectionPoint::GetIID, když je umístěno mezi těmito dvěma makry.

V druhém příkladu se kód vloží do souboru implementace ovládacího prvku (.cpp soubor). Tento kód implementuje mapu připojení, která zahrnuje spojovací bod: SampleConnPt

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

Pokud má vaše třída více než jeden spojovací bod, vložte mezi makra BEGIN_CONNECTION_MAP a END_CONNECTION_MAP další CONNECTION_PART makra.

Nakonec do konstruktoru třídy přidejte volání EnableConnections . Například:

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

Po vložení tohoto kódu vaše CCmdTarget-odvozená třída zveřejňuje spojovací bod pro ISampleSink rozhraní. Následující obrázek znázorňuje tento příklad.

Diagram znázorňující spojovací bod implementovaný pomocí knihovny MFC
Spojovací bod implementovaný v prostředí MFC

Spojovací body obvykle podporují "vícesměrové vysílání" – schopnost vysílat do více jímek připojených ke stejnému rozhraní. Následující příklad fragmentu ukazuje, jak provést vícesměrové vysílání iterací přes každou jímku v spojovacím bodu:

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

Tento příklad načte aktuální sadu připojení na spojovacím bodu SampleConnPt s voláním CConnectionPoint::GetConnections. Pak iteruje prostřednictvím připojení a volá ISampleSink::SinkFunc na každé aktivní připojení.

Viz také

MFC COM