Architecture des objets connectables
L’objet connectable n’est qu’une partie de l’architecture globale des objets connectables. Cette technologie comprend les éléments suivants :
- Objet connectable. Implémente l’interface IConnectionPointContainer ; crée au moins un objet de point de connexion ; définit une interface sortante pour le client.
- Client. Interroge l’objet pour IConnectionPointContainer pour déterminer si l’objet est connectable ; crée un objet récepteur pour implémenter l’interface sortante définie par l’objet connectable.
- Objet récepteur. Implémente l’interface sortante ; permet d’établir une connexion à l’objet connectable.
- Objet point de connexion. Implémente l’interface IConnectionPoint et gère la connexion avec le récepteur du client.
Les relations entre un client, un objet connectable, un point de connexion et un récepteur sont illustrées dans le diagramme suivant :
Avant que l’objet point de connexion appelle des méthodes dans l’interface récepteur à l’étape 3 du diagramme précédent, il doit QueryInterface pour l’interface spécifique requise, même si le pointeur a déjà été passé dans l’appel à l’étape 2 de la méthode Advise .
Deux objets énumérateurs sont également impliqués dans cette architecture, mais pas dans l’illustration. Un est créé par une méthode dans IConnectionPointContainer pour énumérer les points de connexion dans l’objet connectable. L’autre est créé par une méthode dans IConnectionPoint pour énumérer les connexions actuellement établies à ce point de connexion. Un point de connexion peut prendre en charge plusieurs interfaces récepteur connectées, et il doit itérer dans la liste des connexions chaque fois qu’il effectue un appel de méthode sur cette interface. Ce processus est appelé multidiffusion.
Lorsque vous travaillez avec des objets connectables, il est important de comprendre que l’objet connectable, chaque point de connexion, chaque récepteur et tous les énumérateurs sont des objets distincts avec des implémentations IUnknown distinctes, des nombres de références distincts et des durées de vie distinctes. Un client qui utilise ces objets est toujours responsable de la libération de tous les nombres de références qu’il possède.
Notes
Un objet connectable peut prendre en charge plusieurs clients et prendre en charge plusieurs récepteurs au sein d’un client. De même, un récepteur peut être connecté à plusieurs objets connectables.
Les étapes permettant d’établir une connexion entre un client et un objet connectable sont les suivantes :
- Le client interroge IConnectionPointContainer sur l’objet pour déterminer si l’objet est connectable. Si cet appel réussit, le client contient un pointeur vers l’interface IConnectionPointContainer sur l’objet connectable et le compteur de référence d’objet connectable a été incrémenté. Sinon, l’objet n’est pas connectable et ne prend pas en charge les interfaces sortantes.
- Si l’objet est connectable, le client tente ensuite d’obtenir un pointeur vers l’interface IConnectionPoint sur un point de connexion au sein de l’objet connectable. Il existe deux méthodes pour obtenir ce pointeur, à la fois dans IConnectionPointContainer::FindConnectionPoint et dans IConnectionPointContainer::EnumConnectionPoints. Quelques étapes supplémentaires sont nécessaires si EnumConnectionPoints est utilisé. (Pour plus d’informations, consultez Utilisation d’IConnectionPointContainer .) En cas de réussite, l’objet connectable et le client prennent tous deux en charge la même interface sortante. L’objet connectable le définit et l’appelle, et le client l’implémente. Le client peut ensuite communiquer via le point de connexion au sein de l’objet connectable.
- Le client appelle ensuite Conseille sur le point de connexion pour établir une connexion entre son interface récepteur et le point de connexion de l’objet. Après cet appel, le point de connexion de l’objet contient un pointeur vers l’interface sortante sur le récepteur.
- Le code à l’intérieur d’Advise appelle QueryInterface sur le pointeur d’interface transmis, demandant l’identificateur d’interface spécifique auquel il se connecte.
- L’objet appelle des méthodes sur l’interface du récepteur en fonction des besoins, à l’aide du pointeur tenu par son point de connexion.
- Le client appelle Unadvise pour arrêter la connexion. Ensuite, le client appelle IConnectionPoint::Release pour libérer sa conservation sur le point de connexion et, par conséquent, le main objet connectable également. Le client doit également appeler IConnectionPointContainer::Release pour libérer sa conservation sur l’objet main connectable.
Rubriques connexes