Marshaling des données
Remonter à Création de serveurs COM simples - Index
Pour les serveurs hors processus et distants, vous devez prendre en compte la façon dont COM effectue le marshaling des données hors du processus en cours. Vous pouvez effectuer le marshaling :
- Automatiquement, en utilisant l'interface IDispatch.
- Automatiquement, en créant une bibliothèque de types avec votre serveur et en marquant l'interface avec le drapeau d'Automation OLE. COM sait comment réaliser le marshaling de tous les types compatibles Automation de la bibliothèque de types et peut implémenter les proxys et les stubs pour vous. Certaines restrictions de types sont nécessaires pour permettre le marshaling automatique.
- Manuellement, en implémentant toutes les méthodes de l'interface IMarshal. Cela s'appelle le marshaling personnalisé.
Remarque : La première méthode, l'utilisation de IDispatch est uniquement disponible sur les serveurs Automation. La seconde méthode est automatiquement disponible sur tous les objets créés par les experts et utilisant une bibliothèque de types.
Sommaire
Types compatibles avec l'Automation
Les résultats de fonctions et les types des paramètres des méthodes déclarés dans les interfaces duales et de répartition doivent être des types compatibles Automation. Les types suivants sont compatibles Automation OLE :
Premièrement, les types autorisés prédéfinis, comme Smallint, Integer, Single, Double et WideString. Pour la liste complète, voir Types autorisés.
Deuxièmement, les types énumération définis dans une bibliothèque de types. Les types énumération compatibles Automation OLE sont stockés dans des valeurs 32 bits et sont traités comme des valeurs de type Integer pour la transmission des paramètres.
Troisièmement, les types interface définis dans une bibliothèque de types qui sont sécurisés Automation OLE, c'est-à-dire dérivés de IDispatch et contenant seulement des types compatibles Automation OLE.
Quatrièmement, les types dispinterface définis dans une bibliothèque de types.
Cinquièmement, tout type enregistrement personnalisé défini dans la bibliothèque de types.
Sixièmement, IFont, IStrings et IPicture. Les objets utilitaires doivent être instanciés pour que correspondent
- un IFont à un TFont
- un IStrings à un TStrings
- un IPicture à un TPicture
Les experts contrôle ActiveX et ActiveForm créent automatiquement ces objets utilitaires lorsque c'est nécessaire. Pour utiliser les objets utilitaires, appelez respectivement les routines globales, GetOleFont, GetOleStrings et GetOlePicture.
Restrictions de type pour le marshaling automatique
Pour qu'une interface supporte le marshaling automatique (aussi appelé marshaling Automation ou marshaling de bibliothèque de types), les restrictions suivantes sont nécessaires. Lorsque vous modifiez votre objet Automation en utilisant l'éditeur de bibliothèques de types, celui-ci applique les restrictions suivantes :
- Les types chaîne doivent être transférés en tant que chaînes larges (BSTR). PChar, UnicodeString et AnsiString ne peuvent pas subir de marshaling en toute sécurité.
- Tous les membres d'une interface double doivent passer un HRESULT comme valeur de retour de fonction. Si la méthode est déclarée par le biais de la convention d'appel safecall, cette condition est imposée automatiquement, avec le type de retour déclaré converti en paramètre de sortie.
- Les membres d'une interface duale qui ont besoin de renvoyer d'autres valeurs doivent spécifier ces paramètres en tant que var ou out, en indiquant un paramètre de sortie pour renvoyer la valeur de la fonction.
Remarque : Une façon d'outrepasser les restrictions des types Automation est d'implémenter une interface IDispatch distincte et une interface personnalisée. Vous pouvez ainsi utiliser tous les types d'arguments. Cela signifie que les clients COM ont la possibilité d'utiliser l'interface personnalisée, à laquelle les contrôleurs Automation peuvent encore accéder. Mais, dans ce cas, il faut implémenter manuellement le code de marshaling.
Marshaling personnalisé
Généralement, vous utiliserez le marshaling automatique dans les serveurs hors processus et distants parce que c'est le plus simple : COM fait le travail à votre place. Cependant, vous pouvez décider de fournir un marshaling personnalisé si vous pensez que ses performances seront supérieures. Si sous implémentez votre propre marshaling personnalisé, vous devez gérer l'interface IMarshal. Pour plus d'informations sur cette approche, voir la documentation Microsoft.