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:
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:
- 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.
- 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.
- 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.
- Il codice all'interno di Consiglia chiama QueryInterface sul puntatore di interfaccia passato, chiedendo l'identificatore di interfaccia specifico a cui si connette.
- L'oggetto chiama metodi sull'interfaccia del sink in base alle esigenze, usando il puntatore mantenuto dal punto di connessione.
- 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.
Argomenti correlati