Partager via


Exemples de modifications incompatibles

Lorsqu’il s’agit de modifications incompatibles, la règle générale malheureuse est la suivante : toute modification peut être rétrocompatible, sauf si elle est très bien comprise. Cette règle nécessite une connaissance des règles de remise de remise. Si vous ne savez pas ce qu’est le NDR, n’apportez pas de modifications. Voici des exemples de modifications qui entraînent généralement une violation d’accès dans l’application ou une BAD_STUB_DATA_EXCEPTION déclenchée 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 inversement. Chaque type de pointeur a une représentation de fil différente.
  • Modification de la taille des données : de courte à longue, de char à wchar_t (unicode), ajout d’un champ à une structure, modification de la taille d’un tableau de taille fixe.
  • Ajout de bras d’union à une union avec une clause par défaut.

Certaines modifications insidieuses 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’une intégrale à un GUID, une structure CLIENT_RECORD avec le champ CLIENT_ID devient incompatible. Cela peut être difficile à détecter s’il est mis en cascade à plusieurs niveaux d’incorporation à un type de paramètre distant réel.
  • Modification d’un type importé. Le type provient peut-être d’un autre composant qui n’est pas distant directement, par conséquent, la modification a été considérée comme compatible.
  • L’utilisation de #ifdef dans un fichier IDL est une mauvaise idée pour les définitions de type ifdef dans un fichier IDL. Il s’agit d’un sinistre qui attend de se produire. Inévitablement, en raison de problèmes de build ou d’autres problèmes, un client est compilé avec un ensemble de définitions différent de celui du serveur, et elles finissent par être incompatibles.