Freigeben über


Beispiele für inkompatible Änderungen

Wenn es um inkompatible Änderungen geht, lautet die unglückliche Faustregel wie folgt: Jede Änderung kann abwärtskompatibel sein, es sei denn, sie ist sehr gut verstanden. Diese Regel erfordert Kenntnisse der NDR-Regeln. Wenn Sie nicht wissen, was der NDR ist, nehmen Sie keine Änderungen vor. Beispiele für Änderungen, die in der Regel zu einer Zugriffsverletzung in der Anwendung oder zu einer BAD_STUB_DATA_EXCEPTION führen, die von der Marshalling-Engine ausgelöst wird, sind die folgenden:

  • Hinzufügen einer neuen Methode in der Mitte der alten Methoden.
  • Hinzufügen oder Entfernen von Parametern zu einer Methode.
  • Ändern eines Attributs, z. B. eines Zeigerattributes: Ändern von [ref] in [eindeutig] oder [ptr] oder umgekehrt. Jeder Zeigertyp verfügt über eine andere Drahtdarstellung.
  • Ändern der Größe der Daten: von kurz zu lang, von char zu wchar_t (Unicode), Hinzufügen eines Felds zu einer Struktur, Ändern der Größe eines Arrays mit fester Größe.
  • Hinzufügen von Union-Arms zu einer Union mit einer Standardklausel.

Einige schleichende Änderungen oder unbeabsichtigte Konflikte zwischen einem Client und einem Server können wie folgt auftreten:

  • Ändern eines Elements eines zusammengesetzten Typs, z. B. einer Struktur oder eines Arrays. Wenn sich beispielsweise ein CLIENT_ID von einem Integral in eine GUID ändert, ist eine CLIENT_RECORD-Struktur mit dem feld CLIENT_ID inkompatibel. Dies kann schwierig zu erkennen sein, wenn es über mehrere Ebenen der Einbettung in einen tatsächlichen Remoteparametertyp kaskadiert wird.
  • Ändern eines importierten Typs. Der Typ kann von einer anderen Komponente stammen, die nicht direkt remote ist. Daher wurde angenommen, dass die Änderung kompatibel ist.
  • Die Verwendung von #ifdef in einer IDL-Datei ist eine schlechte Idee für ifdef-Typdefinitionen in einer IDL-Datei– es ist ein Notfall, der auf das Eintreten wartet. Zwangsläufig wird ein Client aufgrund von Build- oder anderen Störungen mit einem anderen Satz von Definierten als der Server kompiliert, und sie sind am Ende inkompatibel.