Verwenden von IConnectionPointContainer
Ein verbindungsfähiges Objekt implementiert IConnectionPointContainer (und macht es über QueryInterfaceverfügbar), um das Vorhandensein ausgehender Schnittstellen anzugeben. Für jede ausgehende Schnittstelle verwaltet das verbindungsfähige Objekt ein Unterobjekt des Verbindungspunkts, das selbst IConnectionPointimplementiert. Das verbindungsfähige Objekt enthält daher die Verbindungspunkte, daher die Benennung von IConnectionPointContainer und IConnectionPoint.
Über IConnectionPointContainerkann ein Client zwei Vorgänge ausführen. Erstens: Wenn der Client bereits über die IID für eine ausgehende Schnittstelle verfügt, die er unterstützt, kann er den entsprechenden Verbindungspunkt für die IID mithilfe von IConnectionPointContainer::FindConnectionPointsuchen. Der Client kann den Verbindungspunkt aufgrund der Container-/enthaltenen Beziehung zwischen dem verbindungsfähigen Objekt und seinen enthaltenen Verbindungspunkten nicht direkt abfragen. Im Grunde ist FindConnectionPoint die QueryInterface für ausgehende Schnittstellen, wenn die IID dem Client bekannt ist.
Zweitens kann der Client alle Verbindungspunkte innerhalb des verbindungsfähigen Objekts über IConnectionPointContainer::EnumConnectionPoints aufzählen. Diese Methode gibt einen IEnumConnectionPoints-Schnittstellenzeiger für ein separates Enumeratorobjekt zurück. Über IEnumConnectionPoints::Nextkann der Client IConnectionPoint-Schnittstellenzeiger auf jeden Verbindungspunkt abrufen.
Nachdem der Client die IConnectionPoint-Schnittstelle erhalten hat, muss er IConnectionPoint::GetConnectionInterface aufrufen, um die IID der ausgehenden Schnittstelle zu bestimmen, die von jedem Verbindungspunkt unterstützt wird. Wenn der Client diese ausgehende Schnittstelle bereits unterstützt, kann er eine Verbindung herstellen. Andernfalls kann die ausgehende Schnittstelle möglicherweise weiterhin unterstützt werden, indem Informationen aus der Typbibliothek des verbindungsfähigen Objekts verwendet werden, um unterstützung zur Laufzeit bereitzustellen. Diese Technik erfordert, dass das verbindungsfähige Objekt die IProvideClassInfo-Schnittstelle unterstützt. (Siehe Verwenden von IProvideClassInfo.)
Da der Enumerator ein separates Objekt ist, muss der Client IEnumConnectionPoints::Release aufrufen, wenn der Enumerator nicht mehr benötigt wird. Darüber hinaus ist jeder Verbindungspunkt ein Objekt mit einem separaten Verweiszähler vom enthaltenden verbindungsfähigen Objekt. Daher muss der Client auch IConnectionPoint::Release für jeden Verbindungspunkt aufrufen, auf den entweder über den Enumerator oder über FindConnectionPointzugegriffen wird.