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 obtenir des IConnectionPointContainer pour déterminer si l’objet est connecté ; 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 ; utilisé pour é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 le client, l’objet connectable, un point de connexion et un récepteur sont illustrées dans le diagramme suivant :

Diagramme qui montre les points de connexion entre le client et l’objet connectable.

Avant que l’objet point de connexion appelle des méthodes dans l’interface du récepteur à l’étape 3 du diagramme précédent, il doit effectuer une opération QueryInterface pour l’interface spécifique requise, même si le pointeur a déjà été passé dans l’appel de l’étape 2 à la méthode Advise .

Les deux objets Enumerator sont également impliqués dans cette architecture, mais ils ne sont pas affichés dans l’illustration. L’un est créé par une méthode dans IConnectionPointContainer pour énumérer les points de connexion dans l’objet connectable. L’autre est créée 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 de récepteur connecté, et il doit itérer au sein de la liste de connexions chaque fois qu’il effectue un appel de méthode sur cette interface. Ce processus porte le nom de 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 décomptes 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 décomptes de références qu’il détient.

Notes

Un objet connectable peut prendre en charge plusieurs clients et peut 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 :

  1. Le client interroge IConnectionPointContainer sur l’objet pour déterminer si l’objet est connectable. Si cet appel réussit, le client conserve un pointeur vers l’interface IConnectionPointContainer sur l’objet connectable et le compteur de référence d’objet connectable a été incrémenté. Dans le cas contraire, l’objet n’est pas connectable et ne prend pas en charge les interfaces sortantes.
  2. Si l’objet est connectable, le client tente ensuite d’obtenir un pointeur vers l’interface IConnectionPoint sur un point de connexion dans 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 de IConnectionPointContainer .) En cas de réussite, l’objet connectable et le client prennent tous les 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 dans l’objet connectable.
  3. Le client appelle ensuite Advise sur le point de connexion pour établir une connexion entre son interface de 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.
  4. Le code à l’intérieur de Advise appelle QueryInterface sur le pointeur d’interface qui est passé, en demandant l’identificateur d’interface spécifique auquel il se connecte.
  5. L’objet appelle des méthodes sur l’interface du récepteur, si nécessaire, à l’aide du pointeur détenu par son point de connexion.
  6. Le client appelle Unadvise pour mettre fin à la connexion. Ensuite, le client appelle IConnectionPoint :: Release pour libérer sa conservation sur le point de connexion et, par conséquent, l’objet connectable principal également. Le client doit également appeler IConnectionPointContainer :: Release pour libérer sa conservation sur l’objet connectable principal.

Interfaces d’objets connectables