Partager via


Exemples de modifications incompatibles

Lorsque vous traitez des changements incompatibles, la règle malheureuse du pouce est la suivante : toute modification peut être incompatible descendante, sauf si elle est très bien comprise. Cette règle nécessite une connaissance des règles de remise. Si vous ne savez pas ce que la remise est, n’apportez pas de modifications. Voici quelques exemples de modifications qui entraînent généralement une violation d’accès dans l’application ou un BAD_STUB_DATA_EXCEPTION déclenché par le moteur de marshaling :

  • Ajout d’une nouvelle méthode au milieu des anciennes méthodes.
  • Ajout ou suppression de paramètres d’une méthode.
  • Modification d’un attribut, par exemple un attribut de pointeur : modification de [ref] en [unique] ou [ptr] ou vice versa. Chaque type de pointeur a une représentation filaire différente.
  • Modification de la taille des données : de court à long, de char à wchar_t (unicode), ajout d’un champ à une structure, en modifiant la taille d’un tableau de taille fixe.
  • Ajout d’armes d’union à une union avec une clause par défaut.

Certaines modifications insidieux ou incompatibilités involontaires entre un client et un serveur peuvent se produire comme suit :

  • Modification d’un membre d’un type composé, comme une structure ou un tableau. Par exemple, si un CLIENT_ID passe d’un élément intégral à un GUID, une structure CLIENT_RECORD avec le champ CLIENT_ID devient incompatible. Cela peut être difficile à détecter s’il est en cascade à plusieurs niveaux d’incorporation dans un type de paramètre distant réel.
  • Modification d’un type importé. Le type peut provenir d’un autre composant qui n’est pas directement distant, donc la modification a été considérée comme compatible.
  • L’utilisation de #ifdef dans un fichier IDL est une mauvaise idée de si les définitions de type ifdef dans un fichier IDL sont en attente de sinistre. Inévitablement, en raison de la génération ou d’autres problèmes, un client est compilé avec un ensemble de définitions différent du serveur, et ils finissent par être incompatibles.