Dela via


Anslutningspunkter

Den här artikeln beskriver hur du implementerar anslutningspunkter (tidigare kallade OLE-anslutningspunkter) med hjälp av MFC-klasserna CCmdTarget och CConnectionPoint.

Tidigare definierade COM (Component Object Model) en allmän mekanism (IUnknown::QueryInterface*) som tillät objekt att implementera och exponera funktioner i gränssnitt. En motsvarande mekanism som tillät objekt att exponera sin förmåga att anropa specifika gränssnitt definierades dock inte. Com definierade alltså hur inkommande pekare till objekt (pekare till objektets gränssnitt) hanterades, men den hade ingen explicit modell för utgående gränssnitt (pekare som objektet innehåller till andra objekts gränssnitt). COM har nu en modell, som kallas anslutningspunkter, som stöder den här funktionen.

En anslutning har två delar: objektet som anropar gränssnittet, som kallas källan, och objektet som implementerar gränssnittet, som kallas mottagare. En anslutningspunkt är det gränssnitt som exponeras av källan. Genom att exponera en anslutningspunkt tillåter en källa mottagare att upprätta anslutningar till sig själv (källan). Genom anslutningspunktsmekanismen (gränssnittet IConnectionPoint) skickas en pekare till mottagargränssnittet från källobjektet. Den här pekaren ger källan åtkomst till mottagarens implementering av en uppsättning medlemsfunktioner. Om du till exempel vill utlösa en händelse som implementeras av mottagaren kan källan anropa lämplig metod för mottagarens implementering. Följande bild visar anslutningspunkten som precis beskrivits.

Diagram som visar en implementerad anslutningspunkt.
En implementerad anslutningspunkt

MFC implementerar den här modellen i klasserna CConnectionPoint och CCmdTarget . Klasser som härleds från CConnectionPoint implementerar IConnectionPoint gränssnittet, som används för att exponera anslutningspunkter för andra objekt. Klasser som härleds från CCmdTarget implementerar IConnectionPointContainer gränssnittet, som kan räkna upp alla ett objekts tillgängliga anslutningspunkter eller hitta en specifik anslutningspunkt.

För varje anslutningspunkt som implementeras i klassen måste du deklarera en anslutningsdel som implementerar anslutningspunkten. Om du implementerar en eller flera anslutningspunkter måste du också deklarera en enda anslutningskarta i klassen. En anslutningskarta är en tabell med anslutningspunkter som stöds av ActiveX-kontrollen.

I följande exempel visas en enkel anslutningskarta och en anslutningspunkt. I det första exemplet deklareras anslutningskartan och -punkten. i det andra exemplet implementeras kartan och punkten. Observera att måste CMyClass vara en CCmdTarget-härledd klass. I det första exemplet infogas kod i klassdeklarationen under avsnittet protected :

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

Makrona BEGIN_CONNECTION_PART och END_CONNECTION_PART deklarerar en inbäddad klass ( XSampleConnPt härledd från CConnectionPoint) som implementerar den här specifika anslutningspunkten. Om du vill åsidosätta medlemsfunktioner CConnectionPoint eller lägga till egna medlemsfunktioner deklarerar du dem mellan dessa två makron. Makrot CONNECTION_IID åsidosätter till exempel medlemsfunktionen när det CConnectionPoint::GetIID placeras mellan dessa två makron.

I det andra exemplet infogas kod i kontrollens implementeringsfil (.cpp fil). Den här koden implementerar anslutningskartan, som innehåller anslutningspunkten: SampleConnPt

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

Om klassen har fler än en anslutningspunkt infogar du ytterligare CONNECTION_PART makron mellan BEGIN_CONNECTION_MAP och END_CONNECTION_MAP makron.

Lägg slutligen till ett anrop till EnableConnections i klassens konstruktor. Till exempel:

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

När den här koden har infogats exponerar den härledda klassen från CCmdTarget en anslutningspunkt för ISampleSink-gränssnittet. Följande bild illustrerar det här exemplet.

Diagram som visar en anslutningspunkt som implementeras med hjälp av MFC.
En anslutningspunkt implementerad med MFC

Vanligtvis stöder anslutningspunkter "multicasting" – möjligheten att sända till flera mottagare som är anslutna till samma gränssnitt. Följande exempelfragment visar hur du multicastar genom att iterera genom varje mottagare på en anslutningspunkt:

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

Det här exemplet hämtar den aktuella uppsättningen anslutningar på SampleConnPt anslutningspunkten med ett anrop till CConnectionPoint::GetConnections. Den itererar sedan genom anslutningarna och anropar ISampleSink::SinkFunc på varje aktiv anslutning.

Se även

MFC COM