Delen via


Architectuur van verbindende objecten

Het koppelbare object is slechts één onderdeel van de algehele architectuur van koppelbare objecten. Deze technologie bevat de volgende elementen:

  • Koppelbaar object. Implementeert deinterfaceIConnectionPointContainer; maakt ten minste één verbindingspuntobject; definieert een uitgaande interface voor de client.
  • Klant. Query's uitvoeren op het object voor IConnectionPointContainer om te bepalen of het object kan worden verbonden; maakt een sinkobject voor het implementeren van de uitgaande interface die is gedefinieerd door het verbindingsbare object.
  • Sink-object. Implementeert de uitgaande interface; wordt gebruikt om een verbinding tot stand te brengen met het verbindingsbare object.
  • Verbindingspuntobject. Implementeert de IConnectionPoint-interface en beheert de verbinding met de sink van de client.

De relaties tussen client, koppelbaar object, een verbindingspunt en een sink worden geïllustreerd in het volgende diagram:

diagram met de verbindingspunten tussen de client en het verbindingsbare object.

Voordat het verbindingspuntobject methoden aanroept in de sink-interface in stap 3 in het voorgaande diagram, moet het QueryInterface voor de specifieke interface vereist, zelfs als de aanwijzer al is doorgegeven in de stap 2-aanroep naar de methode Adviseren.

Er zijn ook twee enumeratorobjecten betrokken bij deze architectuur, maar niet weergegeven in de afbeelding. Er wordt een methode gemaakt in IConnectionPointContainer om de verbindingspunten in het koppelbare object op te sommen. De andere methode wordt gemaakt in IConnectionPoint- om de verbindingen op te sommen die momenteel met dat verbindingspunt tot stand zijn gebracht. Eén verbindingspunt kan meerdere verbonden sinkinterfaces ondersteunen en moet elke keer dat er een methodeaanroep op die interface wordt uitgevoerd, de lijst met verbindingen doorlopen. Dit proces wordt multicasting genoemd.

Wanneer u werkt met koppelbare objecten, is het belangrijk om te begrijpen dat het koppelbare object, elk verbindingspunt, elke sink en alle enumerators afzonderlijke objecten zijn met afzonderlijke IUnknown implementaties, afzonderlijke referentieaantallen en afzonderlijke levensduur. Een client die deze objecten gebruikt, is altijd verantwoordelijk voor het vrijgeven van alle referentieaantallen die eigenaar zijn.

Notitie

Een verbindend object kan meer dan één client ondersteunen en meerdere sinks binnen een client ondersteunen. Op dezelfde manier kan een sink worden verbonden met meer dan één aansluitbaar object.

 

De stappen voor het tot stand brengen van een verbinding tussen een client en een koppelbaar object zijn als volgt:

  1. De client zoekt naar IConnectionPointContainer op het object om te bepalen of het object verbinding kan maken. Als deze aanroep is geslaagd, bevat de client een aanwijzer naar de IConnectionPointContainer interface op het koppelbare object en is de referentiemeteritem voor koppelbare objecten verhoogd. Anders kan het object geen verbinding maken en biedt geen ondersteuning voor uitgaande interfaces.
  2. Als het object kan worden verbonden, probeert de client vervolgens een aanwijzer te verkrijgen naar de IConnectionPoint-interface op een verbindingspunt binnen het verbindingsobject. Er zijn twee methoden voor het verkrijgen van deze aanwijzer, zowel in IConnectionPointContainer::FindConnectionPoint als in IConnectionPointContainer::EnumConnectionPoints. Er zijn enkele extra stappen nodig als EnumConnectionPoints- wordt gebruikt. (Zie IConnectionPointContainer gebruiken voor meer informatie.) Als dit lukt, ondersteunen het verbindingbare object en de client beide dezelfde uitgaande interface. Het verbindingbare object definieert het en roept het aan en de client implementeert het. De client kan vervolgens communiceren via het verbindingspunt binnen het verbindingsobject.
  3. De client roept vervolgens adviseren op het verbindingspunt aan om een verbinding tot stand te brengen tussen de sinkinterface en het verbindingspunt van het object. Na deze aanroep bevat het verbindingspunt van het object een aanwijzer naar de uitgaande interface op de sink.
  4. De code in Adviseer roept QueryInterface- aan op de interface-aanwijzer die wordt doorgegeven en vraagt om de specifieke interface-id waarmee deze verbinding maakt.
  5. Het object roept waar nodig methoden aan op de interface van de sink, met behulp van de aanwijzer die door het verbindingspunt wordt vastgehouden.
  6. De client roept niet- ongedaan maken om de verbinding te beëindigen. Vervolgens roept de client aan IConnectionPoint::Release om de bewaring op het verbindingspunt vrij te maken en daarom ook het hoofdverbindingsobject. De client moet ook IConnectionPointContainer::Release aanroepen om de bewaring vrij te maken van het hoofdobject dat verbinding kan maken.

Verbindingsbare objectinterfaces