Condividi tramite


Architettura di oggetti Connessione able

L'oggetto connettibile è solo una parte dell'architettura complessiva degli oggetti collegabili. Questa tecnologia include gli elementi seguenti:

  • oggetto Connessione able. Implementa l'interfaccia I Connessione ionPointContainer; crea almeno un oggetto punto di connessione; definisce un'interfaccia in uscita per il client.
  • Client. Esegue una query sull'oggetto per I Connessione ionPointContainer per determinare se l'oggetto è collegabile. Crea un oggetto sink per implementare l'interfaccia in uscita definita dall'oggetto connettibile.
  • Oggetto sink. Implementa l'interfaccia in uscita; utilizzato per stabilire una connessione all'oggetto connettibile.
  • Connessione oggetto punto di Connessione. Implementa l'interfaccia I Connessione ionPoint e gestisce la connessione con il sink del client.

Le relazioni tra client, oggetto connettibile, punto di connessione e sink sono illustrate nel diagramma seguente:

Diagram that shows the connection points between the Client and Connectable Object.

Prima che l'oggetto punto di connessione chiami i metodi nell'interfaccia sink nel passaggio 3 del diagramma precedente, deve eseguire QueryInterface per l'interfaccia specifica richiesta, anche se il puntatore è già stato passato nel passaggio 2 della chiamata al metodo Advise.

In questa architettura sono coinvolti anche due oggetti enumeratore, anche se non visualizzati nell'illustrazione. Uno viene creato da un metodo in I Connessione ionPointContainer per enumerare i punti di connessione all'interno dell'oggetto connettibile. L'altro viene creato da un metodo in I Connessione ionPoint per enumerare le connessioni attualmente stabilite a tale punto di connessione. Un punto di connessione può supportare più interfacce sink connesse e deve scorrere l'elenco delle connessioni ogni volta che effettua una chiamata al metodo su tale interfaccia. Questo processo è noto come multicast.

Quando si utilizzano oggetti connettibili, è importante comprendere che l'oggetto connettibile, ogni punto di connessione, ogni sink e tutti gli enumeratori sono oggetti separati con implementazioni IUnknown separate, conteggi dei riferimenti separati e durate separate. Un client che usa questi oggetti è sempre responsabile del rilascio di tutti i conteggi dei riferimenti di cui è proprietario.

Nota

Un oggetto connettibile può supportare più client e può supportare più sink all'interno di un client. Analogamente, un sink può essere connesso a più oggetti collegabili.

 

I passaggi per stabilire una connessione tra un client e un oggetto connettibile sono i seguenti:

  1. Il client esegue una query per I Connessione ionPointContainer sull'oggetto per determinare se l'oggetto è collegabile. Se la chiamata ha esito positivo, il client contiene un puntatore all'interfaccia I Connessione ionPointContainer nell'oggetto connettibile e il contatore dei riferimenti agli oggetti collegabili è stato incrementato. In caso contrario, l'oggetto non è collegabile e non supporta le interfacce in uscita.
  2. Se l'oggetto è connettibile, il client tenta di ottenere un puntatore all'interfaccia I Connessione ionPoint in un punto di connessione all'interno dell'oggetto connettibile. Esistono due metodi per ottenere questo puntatore, entrambi in I Connessione ionPointContainer::Find Connessione ionPoint e in I Connessione ionPointContainer::Enum Connessione ionPoints. Se si usa Enum Connessione ionPoints, sono necessari alcuni passaggi aggiuntivi. (Vedere Uso di I Connessione ionPointContainer per altre informazioni. In caso di esito positivo, l'oggetto connettibile e il client supportano entrambe la stessa interfaccia in uscita. L'oggetto connettibile lo definisce e lo chiama e il client lo implementa. Il client può quindi comunicare tramite il punto di connessione all'interno dell'oggetto connettibile.
  3. Il client chiama quindi Advise sul punto di connessione per stabilire una connessione tra l'interfaccia sink e il punto di connessione dell'oggetto. Dopo questa chiamata, il punto di connessione dell'oggetto contiene un puntatore all'interfaccia in uscita nel sink.
  4. Il codice all'interno di Advise chiama QueryInterface sul puntatore di interfaccia passato, chiedendo l'identificatore di interfaccia specifico a cui si connette.
  5. L'oggetto chiama metodi sull'interfaccia del sink in base alle esigenze, usando il puntatore mantenuto dal punto di connessione.
  6. Il client chiama Unadvise per terminare la connessione. Il client chiama quindi I Connessione ionPoint::Release per liberare il blocco sul punto di connessione e, pertanto, anche l'oggetto collegabile principale. Il client deve anche chiamare I Connessione ionPointContainer::Release per liberarne il blocco sull'oggetto connettibile principale.

interfacce oggetto Connessione able