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.
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 CCmdTarget
abgeleitete 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 CConnectionPoint
diesen 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 CCmdTarget
abgeleitete Klasse einen Verbindungspunkt für die ISampleSink
Schnittstelle verfügbar. Die folgende Abbildung veranschaulicht dieses Beispiel.
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.