Esempi di modifiche incompatibili
Quando si tratta di modifiche incompatibili, la regola sfortunata di pollice è la seguente: qualsiasi modifica può essere incompatibile con le versioni precedenti, a meno che non sia molto ben comprensibile. Questa regola richiede la conoscenza delle regole NDR. Se non si sa qual è il rapporto di mancato recapito, non apportare modifiche. Di seguito sono riportati alcuni esempi di modifiche che in genere causano una violazione di accesso nell'applicazione o un BAD_STUB_DATA_EXCEPTION generato dal motore di marshalling:
- Aggiunta di un nuovo metodo al centro dei metodi precedenti.
- Aggiunta o rimozione di parametri da un metodo.
- Modifica di un attributo, ad esempio un attributo puntatore: modifica di [ref] in [unique] o [ptr] o viceversa. Ogni tipo di puntatore ha una rappresentazione di filo diversa.
- Modifica delle dimensioni dei dati: da short a long, da char a wchar_t (unicode), aggiungendo un campo a una struttura, modificando le dimensioni di una matrice di dimensioni fisse.
- Aggiunta di armi di unione a un'unione con una clausola predefinita.
Alcune modifiche insidie o mancate corrispondenze impreviste tra un client e un server possono verificarsi come segue:
- Modifica di un membro di un tipo composto, ad esempio una struttura o una matrice. Ad esempio, se un CLIENT_ID passa da un integrale a un GUID, una struttura CLIENT_RECORD con il campo CLIENT_ID diventa incompatibile. Questo può essere difficile da rilevare se è stato eseguito il cascading tra diversi livelli di incorporamento in un tipo di parametro remoto effettivo.
- Modifica di un tipo importato. Il tipo può provenire da un componente diverso che non è direttamente remoto, quindi la modifica è stata considerata compatibile.
- L'uso di #ifdef in un file IDL non è un'idea valida per le definizioni dei tipi ifdef in un file IDL. È in attesa di un'emergenza. Inevitabilmente, a causa della compilazione o di altri errori, un client viene compilato con un set diverso di definisce rispetto al server e finisce per essere incompatibile.