IMarshal ::GetUnmarshalClass, méthode (objidl.h)
Récupère le CLSID du code de démarshalation.
HRESULT GetUnmarshalClass(
[in] REFIID riid,
[in] void *pv,
[in] DWORD dwDestContext,
[in] void *pvDestContext,
[in] DWORD mshlflags,
[out] CLSID *pCid
);
[in] riid
Référence à l’identificateur de l’interface à marshaler.
[in] pv
Pointeur vers l’interface à marshaler ; peut avoir la valeur NULL si l’appelant n’a pas de pointeur vers l’interface souhaitée.
[in] dwDestContext
Contexte de destination dans lequel l’interface spécifiée doit être démarshalée. Les valeurs possibles proviennent de l’énumération MSHCTX. Le démarshalation peut se produire dans un autre appartement du processus actuel (MSHCTX_INPROC) ou dans un autre processus sur le même ordinateur que le processus actuel (MSHCTX_LOCAL).
[in] pvDestContext
Ce paramètre est réservé et doit être NULL.
[in] mshlflags
Indique si les données à marshaler doivent être transmises au processus client (cas classique) ou écrites dans une table globale, où elles peuvent être récupérées par plusieurs clients. Les valeurs possibles proviennent de l’énumération MSHLFLAGS .
[out] pCid
Pointeur qui reçoit le CLSID à utiliser pour créer un proxy dans le processus client.
Si la méthode réussit, la valeur de retour est S_OK. Sinon, c’est S_FALSE.
Cette méthode est appelée indirectement, dans un appel à CoMarshalInterface, par tout code du processus serveur chargé de marshaler un pointeur vers une interface sur un objet. Ce code de marshaling est généralement un stub généré par COM pour l’une des plusieurs interfaces qui peuvent marshaler un pointeur vers une interface implémentée sur un objet entièrement différent. Par exemple, les interfaces IClassFactory et IOleItemContainer . À des fins de discussion, le code responsable du marshaling d’un pointeur est appelé stub de marshaling.
Pour créer un proxy pour un objet, COM nécessite deux éléments d’informations de l’objet d’origine : la quantité de données à écrire dans le flux de marshaling et le CLSID du proxy.
Le stub de marshaling obtient ces deux informations avec des appels successifs à CoGetMarshalSizeMax et CoMarshalInterface.
Le stub de marshaling appelle l’implémentation de cette méthode par l’objet pour obtenir le CLSID à utiliser lors de la création d’un instance du proxy. Le client, lors de la réception du CLSID, charge la DLL répertoriée pour lui dans le registre système.Vous n’appelez pas explicitement cette méthode si vous implémentez des interfaces COM existantes ou si vous utilisez le langage MIDL (Microsoft Interface Definition Language) pour définir vos propres interfaces. Dans les deux cas, le stub effectue automatiquement l’appel. Consultez Définition d’interfaces COM.
Si vous n’utilisez pas MIDL pour définir votre propre interface, votre stub doit appeler cette méthode, directement ou indirectement, pour obtenir le CLSID dont la bibliothèque COM côté client a besoin pour créer un proxy pour l’objet implémentant l’interface.
Si l’appelant a un pointeur vers l’interface à marshaler, il doit, par souci d’efficacité, utiliser le paramètre pv pour passer ce pointeur. De cette façon, une implémentation qui peut utiliser un tel pointeur pour déterminer le CLSID approprié pour le proxy n’a pas besoin d’appeler QueryInterface sur elle-même. Si un appelant n’a pas de pointeur vers l’interface à marshaler, il peut passer null.
COM appelle GetUnmarshalClass pour obtenir le CLSID à utiliser pour créer un proxy dans le processus client. Le CLSID à utiliser pour un proxy n’est normalement pas celui de l’objet d’origine, mais celui que vous aurez généré (à l’aide de l’outil Guidgen.exe) spécifiquement pour votre objet proxy.Implémentez cette méthode pour chaque objet qui fournit le marshaling pour une ou plusieurs de ses interfaces. Le code responsable du marshaling de l’objet écrit le CLSID, ainsi que les données de marshaling, dans un flux ; COM extrait le CLSID et les données du flux côté réception.
Si votre implémentation de proxy consiste simplement à copier la totalité de l’objet d’origine dans le processus client, éliminant ainsi la nécessité de transférer les appels à l’objet d’origine, le CLSID retourné est identique à celui de l’objet d’origine. Bien entendu, cette stratégie est recommandée uniquement pour les objets qui ne sont pas censés changer.
Si le paramètre pv est NULL et que votre implémentation a besoin d’un pointeur d’interface, elle peut appeler QueryInterface sur l’objet actuel pour l’obtenir. Le paramètre pv existe simplement pour améliorer l’efficacité.
Pour vous assurer que votre implémentation de GetUnmarshalClass continue de fonctionner correctement à mesure que de nouveaux contextes de destination sont pris en charge à l’avenir, délèguez le marshaling à l’implémentation COM par défaut pour toutes les valeurs dwDestContext que votre implémentation ne gère pas. Pour déléguer le marshaling à l’implémentation COM par défaut, appelez la fonction CoGetStandardMarshal .
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 2000 Professionnel [applications de bureau | Applications UWP] |
Serveur minimal pris en charge | Windows 2000 Server [applications de bureau | Applications UWP] |
Plateforme cible | Windows |
En-tête | objidl.h |