Condividi tramite


Architettura di oggetti connettibili

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

  • Oggetto connettibile. Implementa l'interfacciaIConnectionPointContainer; crea almeno un oggetto punto di connessione; definisce un'interfaccia in uscita per il client.
  • Cliente. Esegue una query sull'oggetto per IConnectionPointContainer 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.
  • Oggetto punto di connessione. Implementa l'interfacciaIConnectionPointe gestisce la connessione con il sink del client.

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

Diagramma che mostra i punti di connessione tra il client e l'oggetto connettibile.

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

In questa architettura sono coinvolti anche due oggetti enumeratore, anche se non visualizzati nell'illustrazione. Uno viene creato da un metodo in IConnectionPointContainer per enumerare i punti di connessione all'interno dell'oggetto connettibile. L'altro viene creato da un metodo in IConnectionPoint 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, 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 IConnectionPointContainer sull'oggetto per determinare se l'oggetto è collegabile. Se la chiamata ha esito positivo, il client contiene un puntatore all'interfaccia IConnectionPointContainer sull'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'interfacciaIConnectionPointin un punto di connessione all'interno dell'oggetto connettibile. Esistono due metodi per ottenere questo puntatore, entrambi in IConnectionPointContainer::FindConnectionPoint e in IConnectionPointContainer::EnumConnectionPoints. Sono necessari alcuni passaggi aggiuntivi se si usa EnumConnectionPoints. Per altre informazioni, vedere Uso di IConnectionPointContainer. 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 Consiglia 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 Consiglia 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 undvise per terminare la connessione. Il client chiama quindi IConnectionPoint::Release per liberare il blocco sul punto di connessione e, pertanto, anche l'oggetto collegabile principale. Il client deve anche chiamare IConnectionPointContainer::Release per liberarne il blocco sull'oggetto connettibile principale.

interfacce di oggetti connettibili