Dela via


Ändra ett befintligt gränssnitt

När det är möjligt implementerar du ett nytt gränssnitt för ditt program i stället för att göra ändringar i ett befintligt. Om du inte kan undvika att ändra ett befintligt gränssnitt använder du endast nya datatyper i nya metoder. Att introducera en ny datatyp eller ändra en befintlig typ är den vanligaste källan till inkompatibilitetsproblem. RPC-körningsmodellen förutsätter att det mottagande programmet känner till de typer av data som det tar emot, så data placeras på tråden utan en allmän databeskrivning. När mottagaren förväntar sig en annan datatyp än vad avsändaren har satt på tråden, genererar en stub ett undantag (eller överföringen misslyckas på annat sätt som inte är lika smidigt).

Ett RPC-gränssnitt definieras av dess UUID och dess huvud- och delversionsnummer. När du ändrar ett befintligt gränssnitt bör du lägga till de nya metoderna i slutet av gränssnittet och ändra delversionsnumret. Om du lägger till metoder någon annanstans eller gör andra ändringar i gränssnittet måste du också ändra huvudversionsnumret.

Realistiskt sett finns det tillfällen då du inte kan ändra även delversionsnumret, eftersom en ny klient inte kommer att kunna kommunicera med en gammal server och du inte kan uppdatera servern. RPC-körningstiden genererar ett undantag, RPC_S_PROCNUM_OUT_OF_RANGE, när en klient anropar en metod utöver de som anges för dess gränssnitt med servern. Lösningen är att lämna versionsnumren oförändrade och skriva klientkoden för att hantera det här undantaget på ett korrekt sätt– genom att klienten försämrar dess prestanda, till exempel eller på vilket sätt som helst som är lämpligt för ditt program.

Det finns en liknande lösning för ett specialfall när du ändrar en datatyp i en befintlig metod. Om du har en union vars grenar är pekare och som inte har en standardgren för okända typer kan du lägga till en ny gren som använder den nya datatypen. Detta ändrar inte storleken på datastrukturen. När klienten pratar med en ny server kan den använda den nya datatypen. Men när klienten pratar med en gammal server genererar körningstiden undantaget RPC_S_INVALID_TAG. Återigen måste du skriva klientkoden för att hantera det här undantaget på rätt sätt.

Ett DCOM-gränssnitt identifieras av dess GUID. I DCOM anses gränssnitt vara oföränderliga och du kan bara göra ändringar genom att skapa ett nytt gränssnitt som ärver från det gamla. Dessa regler säkerställer att klienter och servrar förblir kompatibla.