Udostępnij za pośrednictwem


Architektura obiektów połączonych

Obiekt, który można połączyć, jest tylko jednym elementem ogólnej architektury połączonych obiektów. Ta technologia obejmuje następujące elementy:

  • Obiekt możliwy do połączenia. Implementuje interfejsIConnectionPointContainer; tworzy co najmniej jeden obiekt punktu połączenia; definiuje interfejs wychodzący dla klienta.
  • Klient. Wysyła zapytanie do obiektu IConnectionPointContainer w celu ustalenia, czy obiekt jest połączony; Tworzy obiekt ujścia w celu zaimplementowania interfejsu wychodzącego zdefiniowanego przez obiekt połączony.
  • Obiekt ujścia. Implementuje interfejs wychodzący; służy do nawiązywania połączenia z obiektem, który można połączyć.
  • Obiekt punktu połączenia. Implementuje interfejs IConnectionPoint i zarządza połączeniem za pomocą ujścia klienta.

Relacje między klientem, obiektem połączonym, punktem połączenia i ujściem przedstawiono na poniższym diagramie:

Diagram przedstawiający punkty połączenia między klientem a obiektem połączonym.

Zanim obiekt punktu połączenia wywołuje metody w interfejsie ujścia w kroku 3 na powyższym diagramie, musi QueryInterface dla określonego interfejsu wymaganego, nawet jeśli wskaźnik został już przekazany w kroku 2 wywołania metody Doradca.

Dwie obiekty modułu wyliczającego są również zaangażowane w tę architekturę, choć nie są pokazane na ilustracji. Jedna jest tworzona przez metodę w IConnectionPointContainer w celu wyliczenia punktów połączenia w obiekcie połączonym. Drugi jest tworzony przez metodę w IConnectionPoint w celu wyliczenia połączeń obecnie ustanowionych do tego punktu połączenia. Jeden punkt połączenia może obsługiwać wiele połączonych interfejsów ujścia i powinien iterować przez listę połączeń za każdym razem, gdy wykonuje wywołanie metody dla tego interfejsu. Ten proces jest znany jako multiemisji.

Podczas pracy z obiektami połączonymi ważne jest, aby zrozumieć, że obiekt połączony, każdy punkt połączenia, każdy ujście i wszystkie moduły wyliczające są oddzielnymi obiektami z oddzielnymi implementacjami IUnknown, oddzielnymi liczbami odwołań i oddzielnymi okresami istnienia. Klient korzystający z tych obiektów jest zawsze odpowiedzialny za zwolnienie wszystkich odwołań, których jest właścicielem.

Nuta

Obiekt z możliwością połączenia może obsługiwać więcej niż jednego klienta i może obsługiwać wiele ujść w kliencie. Podobnie ujście może być połączone z więcej niż jednym obiektem połączonym.

 

Kroki nawiązywania połączenia między klientem a obiektem połączonym są następujące:

  1. Klient wykonuje zapytania dotyczące IConnectionPointContainer na obiekcie w celu ustalenia, czy obiekt jest połączony. Jeśli to wywołanie powiedzie się, klient przechowuje wskaźnik do interfejsu IConnectionPointContainer na połączonym obiekcie, a licznik odwołania do obiektu z możliwością połączenia został przyrostowany. W przeciwnym razie obiekt nie jest połączony i nie obsługuje interfejsów wychodzących.
  2. Jeśli obiekt jest połączony, klient następnie próbuje uzyskać wskaźnik do interfejsu IConnectionPoint w punkcie połączenia w obiekcie połączonym. Istnieją dwie metody uzyskiwania tego wskaźnika, zarówno w IConnectionPointContainer::FindConnectionPoint, jak i w IConnectionPointContainer::EnumConnectionPoints. Jeśli jest używana EnumConnectionPoints, należy wykonać kilka dodatkowych kroków. (Zobacz Using IConnectionPointContainer , aby uzyskać więcej informacji). W przypadku pomyślnego nawiązania połączenia obiekt i klient obsługują ten sam interfejs wychodzący. Obiekt połączony definiuje go i wywołuje, a klient go implementuje. Klient może następnie komunikować się za pośrednictwem punktu połączenia w obiekcie, który można połączyć.
  3. Następnie klient wywołuje Advise w punkcie połączenia, aby ustanowić połączenie między interfejsem ujścia a punktem połączenia obiektu. Po tym wywołaniu punkt połączenia obiektu przechowuje wskaźnik do interfejsu wychodzącego ujścia.
  4. Kod wewnątrz Advise wywołuje QueryInterface w wskaźniku interfejsu, w którym jest przekazywany, prosząc o określony identyfikator interfejsu, z którym się łączy.
  5. Obiekt wywołuje metody w interfejsie ujścia zgodnie z potrzebami przy użyciu wskaźnika przechowywanego przez jego punkt połączenia.
  6. Klient wywołuje unadvise, aby przerwać połączenie. Następnie klient wywołuje IConnectionPoint::Release, aby zwolnić blokadę punktu połączenia i dlatego główny obiekt połączony również. Klient musi również wywołać IConnectionPointContainer::Release, aby zwolnić blokadę głównego obiektu, który można połączyć.

interfejsy obiektów connectable