Share 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 alterar uma interface existente, use novos tipos de dados apenas em novos métodos. Introduzir um novo tipo de dados ou modificar um tipo existente é a fonte mais comum de problemas de incompatibilidade. O modelo de tempo de execução RPC pressupõe que o aplicativo receptor saiba sobre os tipos de dados que recebe, portanto, os dados são colocados na transmissão sem uma descrição de dados genérica. Quando o destinatário espera um tipo de dados diferente do que o remetente colocou na transmissão, o stub gera uma exceção (ou a transmissão falha de alguma outra maneira menos normal).

Uma interface RPC é definida por sua UUID e seus números de versão principal e secundária. Ao alterar uma interface existente, você deve adicionar os novos métodos no final da interface e alterar o número de versão secundária. Se você adicionar métodos em qualquer outro lugar ou fizer 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 nem mesmo o número de versão secundária, pois um novo cliente não poderá se comunicar com um servidor antigo e você não poderá atualizar o servidor. O tempo de execução de 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 normalmente— pelo cliente degradando seu desempenho, por exemplo, ou por qualquer meio apropriado para seu aplicativo.

Há uma solução alternativa semelhante para um caso especial de alteração de um tipo de dados em um método existente. Se você tiver uma união cujos branches são ponteiros e que não tenha um branch padrão para tipos não reconhecidos, você poderá adicionar um novo branch que usa 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 falar 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ê só pode fazer alterações criando uma nova interface que herda da antiga. Essas regras garantem que os clientes e servidores permaneçam compatíveis.