Implémentation et activation d’un gestionnaire sans données de serveur supplémentaires

Pour créer une instance de votre gestionnaire, s’il s’agit d’un gestionnaire qui n’obtient aucune donnée de serveur supplémentaire, le serveur doit implémenter IStdMarshalInfo, mais pas IMarshal. IStdMarshalInfo a une méthode, GetClassForHandler, qui récupère le CLSID du gestionnaire d’objets à utiliser dans le processus de destination. COM appelle ceci lorsqu’il appelle CoMarshalInterface pour vous et active le gestionnaire côté client.

Ensuite, les implémentations serveur et gestionnaire doivent appeler la fonction CoGetStdMarshalEx . Cette fonction crée un marshaleur standard de chaque côté (appelé gestionnaire de proxy côté client et gestionnaire de stub côté serveur).

Le serveur appelle CoGetStdMarshalEx, en passant l’indicateur SMEXF_SERVER. Cela crée un marshaleur standard côté serveur (gestionnaire de stubs). La structure côté serveur est illustrée dans l’illustration suivante :

Diagramme montrant la structure côté serveur.

structure Server-Side

Le gestionnaire appelle CoGetStdMarshalEx, en passant l’indicateur SMEXF_HANDLER. Cela crée un marshaleur standard côté client (gestionnaire de proxy) et l’agrège avec le gestionnaire côté client. La durée de vie des deux est gérée par l’objet d’identité de contrôle (implémentant IUnknown) que le système implémente lorsque le gestionnaire appelle CoGetStdMarshalEx. La structure côté client est illustrée dans l’illustration suivante.

DIagram qui montre la structure côté client.

structure Client-Side

Comme indiqué dans l’illustration précédente, le gestionnaire est en fait mis en sandwich entre le gestionnaire de proxys et l’identité/le contrôle inconnu. Cela permet au système de contrôler la durée de vie de l’objet tout en donnant au gestionnaire le contrôle sur les interfaces exposées. La ligne en pointillés entre identity et proxy Manager indique que les deux partagent une intégration étroite via des interfaces privées internes.

Lorsque COM appelle CoUnmarshalInterface pour le client, il crée le gestionnaire instance, en l’agrégeant avec l’identité. Le gestionnaire crée le marshaleur standard (par le biais de l’appel à CoGetStdMarshalEx, en passant l’inconnu de contrôle qu’il a reçu lors de sa création). Le gestionnaire n’implémente pas IMarshal , mais retourne simplement IMarshal à partir du marshaleur standard. Même si le gestionnaire implémente IMarshal, il n’est pas appelé pendant un unmarshal.

Si deux threads démarshalent simultanément le même objet pour la première fois, deux gestionnaires peuvent être créés temporairement. Un sera libéré par la suite.

Gestionnaire de Client-Side léger