Delen via


Verbindingspunten

In dit artikel wordt uitgelegd hoe u verbindingspunten (voorheen OLE-verbindingspunten genoemd) implementeert met behulp van de MFC-klassen CCmdTarget en CConnectionPoint.

In het verleden definieerde het Component Object Model (COM) een algemeen mechanisme (IUnknown::QueryInterface*) waarmee objecten functionaliteit in interfaces konden implementeren en beschikbaar maken. Een bijbehorend mechanisme waarmee objecten hun mogelijkheid om specifieke interfaces aan te roepen beschikbaar konden maken, is echter niet gedefinieerd. Met andere woorden, COM definieerde hoe binnenkomende pointers naar objecten (pointers naar de interfaces van dat object) werden verwerkt, maar het had geen expliciet model voor uitgaande interfaces (pointers die het object naar de interfaces van andere objecten vasthoudt). COM heeft nu een model, verbindingspunten genoemd, dat deze functionaliteit ondersteunt.

Een verbinding heeft twee delen: het object dat de interface aanroept, de bron genoemd, en het object dat de interface implementeert, de sink genoemd. Een verbindingspunt is de interface die door de bron wordt weergegeven. Door een verbindingspunt bloot te leggen, stelt een bron ontvangende punten in staat om verbindingen met zichzelf (de bron) tot stand te brengen. Via het verbindingspuntmechanisme (de IConnectionPoint interface) wordt een aanwijzer naar de sink-interface doorgegeven aan het bronobject. Deze aanwijzer geeft de bron toegang tot de implementatie van een set lidfuncties van de sink. Als u bijvoorbeeld een gebeurtenis wilt activeren die door de sink is geïmplementeerd, kan de bron de juiste methode van de implementatie van de sink aanroepen. In de volgende afbeelding ziet u het verbindingspunt dat u zojuist hebt beschreven.

Diagram met een geïmplementeerd verbindingspunt.
Een geïmplementeerd verbindingspunt

MFC implementeert dit model in de klassen CConnectionPoint en CCmdTarget . Klassen die zijn afgeleid van CConnectionPoint implementeren de IConnectionPoint interface, welke wordt gebruikt om verbindingspunten beschikbaar te stellen aan andere objecten. Klassen die zijn afgeleid van CCmdTarget het implementeren van de IConnectionPointContainer interface, waarmee alle beschikbare verbindingspunten van een object kunnen worden opgesomd of een specifiek verbindingspunt kunnen worden gevonden.

Voor elk verbindingspunt dat in uw klasse is geïmplementeerd, moet u een verbindingsonderdeel declareren waarmee het verbindingspunt wordt geïmplementeerd. Als u een of meer verbindingspunten implementeert, moet u ook een enkele connectiemap in uw klasse declareren. Een verbindingstoewijzing is een tabel met verbindingspunten die worden ondersteund door het ActiveX-besturingselement.

In de volgende voorbeelden ziet u een eenvoudig verbindingsschema en één verbindingspunt. Het eerste voorbeeld verklaart het verbindingsschema en het punt; in het tweede voorbeeld worden het schema en het punt geïmplementeerd. Houd er rekening mee dat dit CMyClass een CCmdTarget-afgeleide klasse moet zijn. In het eerste voorbeeld wordt code ingevoegd in de klassedeclaratie, onder de protected sectie:

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

De BEGIN_CONNECTION_PART- en END_CONNECTION_PART-macro's declareren een ingesloten klasse (XSampleConnPt afgeleid vanCConnectionPoint), waarmee dit specifieke verbindingspunt wordt geïmplementeerd. Als u een van de CConnectionPoint lidfuncties wilt overschrijven of lidfuncties van uzelf wilt toevoegen, declareert u deze tussen deze twee macro's. De macro overschrijft bijvoorbeeld CONNECTION_IID de CConnectionPoint::GetIID lidfunctie wanneer deze tussen deze twee macro's wordt geplaatst.

In het tweede voorbeeld wordt code ingevoegd in het implementatiebestand van het besturingselement (.cpp bestand). Met deze code wordt de verbindingskaart geïmplementeerd, die het verbindingspunt bevat, SampleConnPt:

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

Als uw klas meer dan één verbindingspunt heeft, voegt u extra CONNECTION_PART macro's in tussen de BEGIN_CONNECTION_MAP en END_CONNECTION_MAP macro's.

Voeg ten slotte een aanroep toe aan EnableConnections in de constructor van de klasse. Voorbeeld:

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

Zodra deze code is ingevoegd, wordt in uw CCmdTarget-afgeleide klasse een verbindingspunt voor de ISampleSink interface weergegeven. In de volgende afbeelding ziet u dit voorbeeld.

Diagram met een verbindingspunt dat is geïmplementeerd met behulp van MFC.
Een verbindingspunt geïmplementeerd met MFC

Meestal ondersteunen verbindingspunten 'multicasting': de mogelijkheid om te uitzenden naar meerdere sinks die zijn verbonden met dezelfde interface. In het volgende voorbeeldfragment wordt getoond hoe u kunt multicasten door elke sink op een verbindingspunt te doorlopen:

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

In dit voorbeeld wordt de huidige set verbindingen op het SampleConnPt verbindingspunt opgehaald met een aanroep naar CConnectionPoint::GetConnections. Vervolgens worden de verbindingen doorlopen en wordt ISampleSink::SinkFunc op elke actieve verbinding aangeroepen.

Zie ook

MFC COM