Sdílet prostřednictvím


Spojovací body

Tento článek vysvětluje, jak implementovat (dříve označovaná jako OLE spojovací body) spojovací body pomocí tříd MFC CCmdTarget a CConnectionPoint.

V minulosti definovaných modelu COM (Component Object) obecný mechanismus (IUnknown::QueryInterface), objekty implementovat a vystavit funkce rozhraní povoleno.Odpovídající mechanismus, který mohou vystavit schopnost volání rozhraní určité objekty však není definována.COM definovaných ukazatelů jak příchozí objekty byly zpracovány (ukazatele na daný objekt rozhraní), ale neměl explicitní modelu pro odchozí rozhraní (objekt obsahuje jiné objekty rozhraní ukazatele).COM má nyní modelu, nazývané spojovací body, který tuto funkci podporuje.

Připojení má dvě části: objekt volání rozhraní s názvem zdroje a objekt implementace rozhraní, se nazývá jímka.Spojovací bod je vystavena zdrojem rozhraní.Zdroj úniku bodu připojení umožňuje propadů připojit k samotné (zdroj).Prostřednictvím připojení bodu mechanismus ( IConnectionPoint rozhraní), ukazatel rozhraní jímky je předán zdrojového objektu.Tento ukazatel obsahuje zdroj s přístupem k provádění sadu funkcí členů jímky.Například požární události implementované jímka zdroj můžete volejte vhodný způsob provádění jímky.Následující obrázek znázorňuje připojení bod právě popsány.

Implementované spojovací bod

Implementace bodu připojení

V tomto modelu implementuje MFC CConnectionPoint a CCmdTarget tříd.Třídy odvozené z CConnectionPoint implementovat IConnectionPoint rozhraní lze zobrazit body připojení k jiným objektům.Třídy odvozené z CCmdTarget implementovat IConnectionPointContainer rozhraní, které lze vytvořit výčet všech bodů objektu k dispozici připojení nebo najít konkrétní spojovací bod.

Pro každý spojovací bod implementován ve své třídě musí prohlásit část připojení, která implementuje spojovací bod.Pokud implementujete jedno nebo více spojovacích bodů, musí také deklarovat jednoho připojení mapy ve své třídě.Mapa připojení je tabulka bodů připojení podporovaný ovládací prvek ActiveX.

Následující příklady znázorňují jednoduché připojení mapy a jeden spojovací bod.První příklad prohlašuje připojení mapy a bod; druhý příklad implementuje mapy a bod.Všimněte si, že CMyClass musí být CCmdTarget-odvozené třídy.V prvním příkladu kódu je vložen v deklaraci třídy pod chráněné oddíl:

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

BEGIN_CONNECTION_PART a END_CONNECTION_PART makra deklarovat třídu vloženého XSampleConnPt (odvozené z CConnectionPoint), že bod implementuje toto konkrétní připojení.Pokud chcete potlačit jakýkoli CConnectionPoint funkce členů nebo přidat funkce členů vlastní, deklarovat mezi tyto dvě makra.Například CONNECTION_IID makro potlačí CConnectionPoint::GetIID členské funkce při umístění mezi tyto dvě makra.

V druhém příkladu kódu je vložena do ovládacího prvku provádění souboru (cpp).Tento kód implementuje mapa připojení zahrnuje spojovací bod, SampleConnPt:

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

Pokud vaše třída má více než jedno připojení bodu, vložit další CONNECTION_PART mezi BEGIN_CONNECTION_MAP a END_CONNECTION_MAP makra.

Nakonec přidejte volání EnableConnections v konstruktoru třídy.Příklad:

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

Po vložení tohoto kódu do CCmdTarget-odvozená třída zpřístupňuje spojovací bod pro ISampleSink rozhraní.Následující obrázek ukazuje tento příklad.

Spojovací bod implementován s MFC

MFC implementace bodu připojení

Obvykle podporují spojovací body "vysílání" – schopnost vysílat pro více umyvadel připojen k stejné rozhraní.Fragment následující příklad ukazuje jak vícesměrového vysílání pomocí iterace každého jímky na spojovací bod:

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

V tomto příkladu načte aktuální nastavení připojení na SampleConnPt spojovací bod s voláním CConnectionPoint::GetConnections.Provádí iterace prostřednictvím připojení a volání ISampleSink::SinkFunc na každý aktivní připojení.

Viz také

Koncepty

MFC COM