Partilhar via


Alterando uma interface existente

Sempre que possível, implemente uma nova interface para seu aplicativo, em vez de fazer alterações em uma existente. Se você não puder evitar a alteração de uma interface existente, use novos tipos de dados somente em novos métodos. A introdução de um novo tipo de dados ou a modificação de um tipo existente é a fonte mais comum de problemas de incompatibilidade. O modelo de tempo de execução RPC pressupõe que o aplicativo recetor sabe sobre os tipos de dados que recebe, portanto, os dados são colocados no fio sem uma descrição genérica de dados. Quando o destinatário espera um tipo de dados diferente do que o remetente colocou no fio, o stub gera uma exceção (ou a transmissão falha de alguma outra maneira menos graciosa).

Uma interface RPC é definida por seu UUID e seus números de versão principal e secundária. Quando você altera uma interface existente, você deve adicionar os novos métodos no final da interface e alterar o número da versão secundária. Se você adicionar métodos em qualquer outro lugar ou fizer quaisquer outras alterações na interface, também precisará alterar o número da versão principal.

Realisticamente, há momentos em que você não pode alterar até mesmo o número da versão secundária, porque um novo cliente não será capaz de se comunicar com um servidor antigo e você não pode atualizar o servidor. O tempo de execução RPC gera uma exceção, RPC_S_PROCNUM_OUT_OF_RANGE, quando um cliente chama um método além dos especificados para sua interface com o servidor. A solução alternativa é deixar os números de versão inalterados e escrever o código do cliente para lidar com essa exceção com elegância — por exemplo, reduzindo o desempenho do cliente, ou por qualquer outro meio apropriado para a sua aplicação.

Há uma solução semelhante para um caso especial de alteração de um tipo de dados em um método existente. Se tiver uma união cujos ramos são ponteiros e que não tem um ramo padrão para tipos não reconhecidos, pode adicionar um novo ramo que utilize o novo tipo de dados. Isso não alterará o tamanho da estrutura de dados. Quando o cliente fala com um novo servidor, ele pode usar o novo tipo de dados. No entanto, quando o cliente fala com um servidor antigo, o tempo de execução gerará a exceção RPC_S_INVALID_TAG. Novamente, você precisará escrever o código do cliente para lidar com essa exceção adequadamente.

Uma interface DCOM é identificada por seu GUID. No DCOM, as interfaces são consideradas imutáveis e você pode fazer alterações apenas criando uma nova interface que herda da antiga. Essas regras garantem que clientes e servidores permaneçam compatíveis.