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.