Punkty połączenia

W tym artykule wyjaśniono, jak zaimplementować punktów połączenia (dawniej znany jako punkty połączenia OLE) za pomocą klasy MFC CCmdTarget i CConnectionPoint.

W przeszłości, system nazw domen (COM, Component Object Model) zdefiniowane mechanizm ogólne (IUnknown::QueryInterface) ten umożliwiał obiektów do wdrożenia i funkcjonalności w interfejsach.Odpowiedni mechanizm, który dozwolone obiektów do udostępnienia ich zdolność do wywoływania określonych interfejsów nie został zdefiniowany.Oznacza to, COM zdefiniować wskaźniki przychodzącymi do obiektów (wskaźniki do tego obiektu interfejsy) były obsługiwane, ale nie ma jawnego modelu dla interfejsów wychodzących (obiekt posiada do innych obiektów interfejsów wskaźników).COM ma teraz modelu, nazywane punktami połączenia, który obsługuje tę funkcję.

Połączenie się z dwóch części: obiekt wywołujący interfejs o nazwie źródło i obiekt implementujący interfejs o nazwie obiekt sink.Punkt połączenia jest interfejs udostępniane przez źródło.Wystawiając punktu połączenia źródła pozwala pochłaniacze do ustanawiania połączeń do siebie (źródło).Poprzez połączenie punkt mechanizm ( IConnectionPoint interface), wskaźnika do interfejsu obiektu sink jest przekazywana do obiektu źródłowego.Ten wskaźnik stanowi źródło z dostępem do wykonania sink jest zbiorem funkcji elementów członkowskich.Na przykład na ogień implementowane przez obiekt sink zdarzenia, źródło może wywołać odpowiednią metodę wykonania sink.Na rysunku poniżej pokazano połączenie punkt opisany powyżej.

Zaimplementowany punkt połączenia

Punkt wdrożonych połączenia

MFC implementuje ten model w CConnectionPoint i klasy klas.Klasy pochodne CConnectionPoint realizacji IConnectionPoint interfejs używany do udostępnienia punkty połączeń do innych obiektów.Klasy pochodne CCmdTarget realizacji IConnectionPointContainer interfejs, który można wyliczyć wszystkie punkty dostępne połączenia obiektu lub znaleźć określonego punktu połączenia.

Dla każdego punktu połączenia wykonywane w swojej klasie należy zadeklarować część połączenia, który implementuje punktu połączenia.Można zaimplementować jeden lub więcej punktów połączenia, musi również zadeklarować mapę pojedynczego połączenia w klasie.Mapa połączenia jest spis punktów połączeń obsługiwanych przez formant ActiveX.

W poniższych przykładach pokazano proste połączenie mapy i jednego punktu połączenia.Pierwszy przykład deklaruje mapę połączenia i punkt; drugi przykład implementuje mapę i punkt.Należy zauważyć, że CMyClass musi być CCmdTarget-klasy.W pierwszym przykładzie kod jest wstawiany w deklaracji klasy pod chronione sekcja:

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 i END_CONNECTION_PART zadeklarować makra osadzonego klasy, XSampleConnPt (pochodzące z CConnectionPoint), że punkt ten szczególny związek implements.Jeśli chcesz zastąpić dowolny CConnectionPoint funkcji elementów członkowskich lub Dodaj funkcje składowe własny, zadeklarować je między tymi dwoma makra.Na przykład CONNECTION_IID makro zastępuje CConnectionPoint::GetIID funkcji składowej umieszczone między tymi dwoma makra.

W drugim przykładzie kod jest wstawiany w kontroli wykonania pliku (CPP).Ten kod implementuje mapę połączenia, który zawiera punkt połączenia, SampleConnPt:

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

Jeśli klasa ma więcej niż jedno połączenie punktu, Wstaw dodatkowe CONNECTION_PART makra między BEGIN_CONNECTION_MAP i END_CONNECTION_MAP makra.

Na koniec należy dodać wywołanie EnableConnections w konstruktora klasy.Na przykład:

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

Po wstawieniu tego kodu z CCmdTarget-Klasa pochodna uwidacznia punktu połączenia dla ISampleSink interfejsu.Na poniższym rysunku pokazano w tym przykładzie.

Punkt połączenia realizowane z MFC

Punkt połączenia realizowane przy użyciu MFC

Zazwyczaj punkty połączeń obsługi "multiemisji" — zdolność do emisji do większej ilości zlewów podłączone do tego samego interfejsu.Poniższy fragment przykład demonstruje sposób multiemisji przez iteracji każdy obiekt sink na punktu połączenia:

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

W tym przykładzie pobiera bieżący zestaw połączeń na SampleConnPt punkt połączenia z wezwaniem do CConnectionPoint::GetConnections.Następnie dokonuje iteracji za pośrednictwem połączenia i rozmowy ISampleSink::SinkFunc dla każdego aktywnego połączenia.

Zobacz też

Koncepcje

MFC COM