Freigeben über


Ändern einer vorhandenen Schnittstelle

Implementieren Sie nach Möglichkeit eine neue Schnittstelle für Ihre Anwendung, anstatt Änderungen an einer vorhandenen Anwendung vorzunehmen. Wenn Sie das Ändern einer vorhandenen Schnittstelle nicht vermeiden können, verwenden Sie neue Datentypen nur in neuen Methoden. Die Einführung eines neuen Datentyps oder das Ändern eines vorhandenen Typs ist die häufigste Ursache von Inkompatibilitätsproblemen. Beim RPC-Laufzeitmodell wird davon ausgegangen, dass die empfangende Anwendung die Empfangenden Datentypen kennt, sodass Daten ohne generische Datenbeschreibung in die Leitung übertragen werden. Wenn der Empfänger einen anderen Datentyp erwartet als den, den der Absender auf den Draht gesetzt hat, löst der Stub eine Ausnahme aus (oder die Übertragung schlägt auf eine andere, weniger ordnungsgemäße Weise fehl).

Eine RPC-Schnittstelle wird durch ihre UUID und ihre Haupt- und Nebenversionsnummern definiert. Wenn Sie eine vorhandene Schnittstelle ändern, sollten Sie die neuen Methoden am Ende der Schnittstelle hinzufügen und die Nebenversionsnummer ändern. Wenn Sie Methoden an einer anderen Stelle hinzufügen oder andere Änderungen an der Schnittstelle vornehmen, müssen Sie auch die Hauptversionsnummer ändern.

Realistischerweise gibt es Situationen, in denen Sie nicht einmal die Nebenversionsnummer ändern können, da ein neuer Client nicht mit einem alten Server kommunizieren kann und Sie den Server nicht aktualisieren können. Die RPC-Laufzeit löst eine Ausnahme RPC_S_PROCNUM_OUT_OF_RANGE aus, wenn ein Client eine Methode aufruft, die über die für die Schnittstelle mit dem Server angegebenen hinausgeht. Die Problemumgehung besteht darin, die Versionsnummern unverändert zu lassen und Ihren Clientcode zu schreiben, um diese Ausnahme ordnungsgemäß zu behandeln, z. B. indem der Client seine Leistung beeinträchtigt oder durch beliebige Mittel, die für Ihre Anwendung geeignet sind.

Es gibt eine ähnliche Problemumgehung für einen Sonderfall, in dem ein Datentyp in einer vorhandenen Methode geändert wird. Wenn Sie über eine Union verfügen, deren Branches Zeiger sind und die keine Standardbranch für nicht erkannte Typen aufweist, können Sie einen neuen Branch hinzufügen, der den neuen Datentyp verwendet. Dadurch wird die Größe der Datenstruktur nicht geändert. Wenn Ihr Client mit einem neuen Server kommuniziert, kann er den neuen Datentyp verwenden. Wenn Ihr Client jedoch mit einem alten Server kommuniziert, löst die Laufzeit die Ausnahme RPC_S_INVALID_TAG aus. Auch hier müssen Sie Ihren Clientcode schreiben, um diese Ausnahme angemessen zu behandeln.

Eine DCOM-Schnittstelle wird durch ihre GUID identifiziert. In DCOM gelten Schnittstellen als unveränderlich, und Sie können Änderungen nur vornehmen, indem Sie eine neue Schnittstelle erstellen, die von der alten schnittstelle erbt. Diese Regeln stellen sicher, dass Clients und Server kompatibel bleiben.