Freigeben über


Verbindungspunkte

In diesem Artikel wird erläutert, wie Sie Verbindungspunkte (früher als OLE-Verbindungspunkte bezeichnet) mit den MFC-Klassen CCmdTarget und CConnectionPoint.

In der Vergangenheit hat das Component Object Model (COM) einen allgemeinen Mechanismus (IUnknown::QueryInterface*) definiert, mit dem Objekte Funktionen in Schnittstellen implementieren und verfügbar machen können. Ein entsprechender Mechanismus, mit dem Objekte ihre Funktion zum Aufrufen bestimmter Schnittstellen verfügbar machen konnten, wurde jedoch nicht definiert. Das heißt, COM hat definiert, wie eingehende Zeiger auf Objekte (Zeiger auf die Schnittstellen dieses Objekts) behandelt wurden, aber kein explizites Modell für ausgehende Schnittstellen (Zeiger, die das Objekt auf die Schnittstellen anderer Objekte hält). COM verfügt jetzt über ein Modell, das als Verbindungspunkte bezeichnet wird und diese Funktionalität unterstützt.

Eine Verbindung hat zwei Teile: das Objekt, das die Schnittstelle aufruft, die Quelle genannt wird, und das Objekt, das die Schnittstelle implementiert, die als Sink bezeichnet wird. Ein Verbindungspunkt ist die Schnittstelle, die von der Quelle verfügbar gemacht wird. Durch die Exposierung eines Verbindungspunkts ermöglicht eine Quelle senken das Herstellen von Verbindungen mit sich selbst (der Quelle). Über den Verbindungspunktmechanismus (schnittstelle IConnectionPoint ) wird ein Zeiger auf die Senkenschnittstelle an das Quellobjekt übergeben. Dieser Zeiger bietet der Quelle Zugriff auf die Implementierung einer Gruppe von Memberfunktionen. Zum Auslösen eines ereignisses, das von der Spüle implementiert wird, kann die Quelle z. B. die entsprechende Methode der Implementierung der Sink aufrufen. Die folgende Abbildung zeigt den soeben beschriebenen Verbindungspunkt.

Diagram showing an implemented connection point.
Implementierter Verbindungspunkt

MFC implementiert dieses Modell in den Klassen C Verbinden ionPoint und CCmdTarget. Von der Implementierung der IConnectionPoint Schnittstelle abgeleitete CConnectionPoint Klassen, die verwendet werden, um Verbindungspunkte für andere Objekte verfügbar zu machen. Von der Implementierung der IConnectionPointContainer Schnittstelle abgeleitete CCmdTarget Klassen, die alle verfügbaren Verbindungspunkte eines Objekts aufzählen oder einen bestimmten Verbindungspunkt finden können.

Für jeden in Ihrer Klasse implementierten Verbindungspunkt müssen Sie einen Verbindungsteil deklarieren, der den Verbindungspunkt implementiert. Wenn Sie einen oder mehrere Verbindungspunkte implementieren, müssen Sie auch eine einzelne Verbindungszuordnung in Ihrer Klasse deklarieren. Eine Verbindungszuordnung ist eine Tabelle mit Verbindungspunkten, die vom ActiveX-Steuerelement unterstützt werden.

Die folgenden Beispiele veranschaulichen eine einfache Verbindungszuordnung und einen Verbindungspunkt. Das erste Beispiel deklariert die Verbindungskarte und den Punkt; Im zweiten Beispiel wird die Karte und der Punkt implementiert. Beachten Sie, dass CMyClass es sich um eine CCmdTargetabgeleitete Klasse handeln muss. Im ersten Beispiel wird Code in die Klassendeklaration eingefügt, unter dem protected Abschnitt:

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

Die makros BEGIN_CONNECTION_PART und END_CONNECTION_PART deklarieren eine eingebettete Klasse ( XSampleConnPt abgeleitet von), die CConnectionPointdiesen bestimmten Verbindungspunkt implementiert. Wenn Sie Memberfunktionen CConnectionPoint außer Kraft setzen oder Eigene Memberfunktionen hinzufügen möchten, deklarieren Sie diese zwischen diesen beiden Makros. Beispielsweise überschreibt das CONNECTION_IID Makro die CConnectionPoint::GetIID Memberfunktion, wenn sie zwischen diesen beiden Makros platziert wird.

Im zweiten Beispiel wird Code in die Implementierungsdatei des Steuerelements (CPP-Datei) eingefügt. Dieser Code implementiert die Verbindungszuordnung, die den Verbindungspunkt enthält: SampleConnPt

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

Wenn ihre Klasse mehrere Verbindungspunkt aufweist, fügen Sie zusätzliche CONNECTION_PART Makros zwischen dem BEGIN_CONNECTION_MAP und END_CONNECTION_MAP Makros ein.

Fügen Sie schließlich einen Aufruf EnableConnections im Konstruktor der Klasse hinzu. Beispiel:

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

Nachdem dieser Code eingefügt wurde, macht die CCmdTargetabgeleitete Klasse einen Verbindungspunkt für die ISampleSink Schnittstelle verfügbar. Die folgende Abbildung veranschaulicht dieses Beispiel.

Diagram showing a Connection point implemented by using MFC.
Ein mit MFC implementierter Verbinden ionspunkt

In der Regel unterstützen Verbindungspunkte "Multicasting" – die Möglichkeit, an mehrere Senken zu übertragen, die mit derselben Schnittstelle verbunden sind. Das folgende Beispielfragment veranschaulicht, wie Multicasts durch Durchlaufen der einzelnen Senken auf einem Verbindungspunkt durchlaufen werden:

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 diesem Beispiel wird der aktuelle Satz von Verbindungen für den SampleConnPt Verbindungspunkt mit einem Aufruf abgerufen CConnectionPoint::GetConnections. Anschließend durchläuft er die Verbindungen und Aufrufe ISampleSink::SinkFunc für jede aktive Verbindung.

Siehe auch

MFC COM