Udostępnij za pośrednictwem


Punkty połączeń

W tym artykule wyjaśniono, jak zaimplementować punktów połączenia (dawniej znany jako punkty połączeń OLE) przy użyciu klas MFC CCmdTarget i CConnectionPoint.

W przeszłości, system nazw domen (COM, Component Object Model) zdefiniowane mechanizm ogólne (IUnknown::QueryInterface), dozwolone obiektów do wdrożenia i narazić funkcjonalność w interfejsach.Jednakże odpowiedni mechanizm, który dozwolone obiektów narazić zdolność do wywoływania określonych interfejsów nie został zdefiniowany.Oznacza to, że COM zdefiniowane wskaźniki jak przychodzących do obiektów (wskaźniki do tego obiektu interfejsów) były obsługiwane, ale nie posiada wyraźne modelu, dla interfejsów wychodzących (wskaźników przechowuje obiekt do innych obiektów interfejsów).COM ma teraz modelu, nazywane punktami połączeń, która obsługuje tę funkcję.

Połączenie ma dwie części: obiekt wywołujący interfejsu o nazwie źródła i obiekt wykonawczych interfejsu, nazywane sink.Punkt połączenia jest interfejs narażone źródłowy.Podnosiły punktu połączenia, źródła pozwala pochłaniacze do ustanawiania połączeń do samego siebie (źródło).Poprzez połączenie punkt mechanizmu ( IConnectionPoint interface), wskaźnika do interfejsu obiektu sink jest przekazywana do obiektu źródłowego.Ten wskaźnik stanowi źródło dostęp do obiektu sink wykonania zestawu funkcji elementów członkowskich.Na przykład ognia implementowane przez obiekt sink zdarzenia, źródła może wywołać metodę właściwe wdrożenie sink.Na rysunku poniżej pokazano połączenie punkt opisany.

Wdrażane punktu połączenia

Zaimplementowany punkt połączenia

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

Dla każdego punktu połączenia w 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ę jednego połączenia, w klasie.Mapa połączenia jest tabela z punktów połączeń obsługiwanych przez formant ActiveX.

Poniżej przedstawiono przykładowe mapę prostego połączenia i punktu jednego połączenia.Pierwszy przykład deklaruje mapę połączenia i punktu; 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 sekcji:

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 makra zadeklarować klasy osadzonego, XSampleConnPt (pochodzące z CConnectionPoint), że implementacja tego połączenia w szczególności pkt.Aby przesłonić CConnectionPoint funkcji elementów członkowskich lub dodać funkcje składowe własny, oświadczają, między te dwa makra.Na przykład CONNECTION_IID zastępuje makro CConnectionPoint::GetIID Członkowskich funkcji umieszczone między te dwa makra.

W drugim przykładzie kodu jest wstawiany 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, wstawić dodatkowe CONNECTION_PART makr między BEGIN_CONNECTION_MAP i END_CONNECTION_MAP makr.

Na koniec dodać wywołanie EnableConnections w konstruktorze klasy.Na przykład:

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

Po wstawieniu tego kodu użytkownika CCmdTarget-klasy pochodnej udostępnia punkt połączenia ISampleSink interfejsu.Następujący rysunek ilustruje ten przykład.

Punkt połączenia Z MFC

MFC implementacja punktu połączenia

Zazwyczaj punkty połączeń obsługi "multiemisji" — zdolność do nadawania do zlewów podłączone do tego samego interfejsu.Poniższy fragment przykład demonstruje sposób multiemisji w drodze iteracji każdego zbiornika na punkt 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 punktu połączenia z zaproszeniem do CConnectionPoint::GetConnections.Następnie dokonuje iteracji za pośrednictwem połączenia i wywołania ISampleSink::SinkFunc dla każdego aktywnego połączenia.

Zobacz też

Koncepcje

MFC COM