Megosztás a következőn keresztül:


Csatlakozási pontok

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Ez a cikk azt ismerteti, hogyan valósíthatók meg a csatlakozási pontok (korábbi nevükön OLE csatlakozási pontok) az MFC-osztályok CCmdTarget és CConnectionPoint segítségével.

Korábban a komponensobjektum-modell (COM) egy általános mechanizmust (IUnknown::QueryInterface*) definiált, amely lehetővé tette az objektumok számára a funkciók felületi implementálását és elérhetővé megvalósításához. Nem definiált azonban egy megfelelő mechanizmust, amely lehetővé tette az objektumok számára, hogy elérhetővé tegyék az adott interfészek meghívására való képességüket. Ez azt jelentette, hogy a COM meghatározta az objektumok bejövő mutatóinak (az objektum felületére mutató mutatók) kezelését, de nem rendelkezik explicit modellel a kimenő felületekhez (az objektum által más objektumok felületére mutató mutatók). A COM most már rendelkezik egy kapcsolati pontnak nevezett modellel, amely támogatja ezt a funkciót.

A kapcsolat két részből áll: az interfészt hívó objektumból, a forrásból, és az interfészt megvalósító objektumból, úgynevezett fogadóból. A csatlakozási pont a forrás által közzétett interfész. Egy csatlakozási pont felfedésével a forrás lehetővé teszi, hogy a csatlakozók kapcsolatot létesítsenek vele (a forrással). A csatlakozási pont mechanizmusán (az IConnectionPoint interfészen) keresztül a fogadó felületre mutató mutatót a rendszer átadja a forrásobjektumnak. Ez az egérmutató hozzáférést biztosít a forrásnak a fogadó tagfüggvények halmazának implementálásához. Például, ha a fogadó által implementált eseményt szeretné elindítani, a forrás meghívhatja a fogadó implementációjának megfelelő metódusát. Az alábbi ábra az imént ismertetett csatlakozási pontot mutatja be.

Egy implementált csatlakozási pontot ábrázoló diagram.
Implementált csatlakozási pont

Az MFC ezt a modellt a CConnectionPoint és a CCmdTarget osztályokban implementálja. A CConnectionPoint-ból származó osztályok implementálják a IConnectionPoint interfészt, amely a csatlakozási pontokat teszi elérhetővé más objektumok számára. Az CCmdTarget osztályok, amelyek megvalósítják a IConnectionPointContainer interfészt, képesek felsorolni egy objektum összes elérhető csatlakozási pontját, vagy megkeresni egy adott csatlakozási pontot.

Az osztályban implementált minden csatlakozási ponthoz deklarálnia kell egy kapcsolati részt, amely megvalósítja a csatlakozási pontot. Ha egy vagy több csatlakozási pontot implementál, egyetlen kapcsolati térképet is deklarálnia kell az osztályban. A kapcsolattérkép az ActiveX-vezérlő által támogatott csatlakozási pontok táblázata.

Az alábbi példák egy egyszerű kapcsolattérképet és egy csatlakozási pontot mutatnak be. Az első példa deklarálja a kapcsolati térképet és a pontot; a második példa implementálja a térképet és a pontot. Vegye figyelembe, hogy a CMyClass egy CCmdTarget származtatott osztálynak kell lennie. Az első példában a kód be lesz szúrva az osztálydeklarációba a protected következő szakaszban:

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

A BEGIN_CONNECTION_PART és END_CONNECTION_PART makrók egy olyan beágyazott osztályt deklarálnak ( XSampleConnPt származtatva CConnectionPoint), amely implementálja ezt az adott csatlakozási pontot. Ha bármelyik CConnectionPoint tagfüggvényt felül szeretné bírálni, vagy saját tagfüggvényeket szeretne hozzáadni, deklarálja őket a két makró között. Például a CONNECTION_IID makró felülbírálja a CConnectionPoint::GetIID tagfüggvényt, amikor a két makró közé kerül.

A második példában a kód be lesz szúrva a vezérlő implementációs fájljába (.cpp fájlba). Ez a kód implementálja a kapcsolati térképet, amely tartalmazza a csatlakozási pontot: SampleConnPt

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

Ha az osztály több csatlakozási ponttal is rendelkezik, szúrjon be további CONNECTION_PART makrókat a BEGIN_CONNECTION_MAP és END_CONNECTION_MAP makrók közé.

Végül adjon hozzá egy EnableConnections hívást az osztály konstruktorában. Például:

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

A kód beszúrása után a CCmdTargetszármaztatott osztály elérhetővé tesz egy csatlakozási pontot a ISampleSink felület számára. Az alábbi ábra ezt a példát szemlélteti.

Az MFC használatával implementált csatlakozási pontot ábrázoló diagram.
MFC-vel implementált csatlakozási pont

A csatlakozási pontok általában támogatják a "csoportos küldést" – ez lehetővé teszi, hogy több vevőhöz is közvetítsenek, amelyek ugyanahhoz az interfészhez csatlakoznak. Az alábbi példatöredék bemutatja, hogyan lehet csoportos küldést létrehozni az egyes fogadókon keresztüli iterálással egy csatlakozási ponton:

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

Ez a példa lekéri a kapcsolati pont aktuális kapcsolatkészletét SampleConnPt egy hívással CConnectionPoint::GetConnections. Ezután végighalad a kapcsolatokon, és meghívja a ISampleSink::SinkFunc függvényt minden aktív kapcsolaton.

Lásd még

MFC COM