Implémentation et activation d’un gestionnaire sans données de serveur supplémentaires
Pour créer une instance de votre gestionnaire, si ce n’est pas le cas, le serveur doit implémenter IStdMarshalInfo mais pas IMarshal. IStdMarshalInfo possède une méthode, GetClassForHandler, qui récupère le CLSID du gestionnaire d’objets à utiliser dans le processus de destination. COM appelle cela quand il appelle CoMarshalInterface pour vous et active le gestionnaire côté client.
Ensuite, les implémentations du serveur et du gestionnaire doivent appeler la fonction CoGetStdMarshalEx . Cette fonction crée un marshaleur standard sur chaque côté (appelé gestionnaire proxy côté client et un gestionnaire de stub côté serveur).
Le serveur appelle CoGetStdMarshalEx, en passant l’indicateur _ Server SMEXF. Cela crée un marshaleur standard côté serveur (gestionnaire stub). La structure côté serveur est présentée dans l’illustration suivante :

Structure Server-Side
Le gestionnaire appelle CoGetStdMarshalEx, en passant le gestionnaire d’indicateurs SMEXF _ . Cela crée un marshaleur standard côté client (gestionnaire proxy) et l’agrège avec le gestionnaire côté client. La durée de vie des deux sont gérées par l’objet d’identité de contrôle (implémentation d' IUnknown) que le système implémente lorsque le gestionnaire appelle CoGetStdMarshalEx. La structure côté client est représentée dans l’illustration suivante.

Structure Client-Side
Comme indiqué dans l’illustration précédente, le gestionnaire est en fait sandwich entre le gestionnaire proxy 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 l’identité et le gestionnaire proxy indique que les deux partagent une étroite intégration via des interfaces privées internes.
Quand COM appelle CoUnmarshalInterface pour le client, il crée l’instance de gestionnaire, en l’agrégeant avec l’identité. Le gestionnaire crée le marshaleur standard (par le biais de l’appel à CoGetStdMarshalEx, en passant le contrôle inconnu 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 démarshaleur.
Si deux threads démarshalent simultanément le même objet pour la première fois, il est possible que deux gestionnaires soient créés temporairement. Une version sera publiée par la suite.