Compartilhar via


Projetando interfaces remotas

Com o advento do modelo de objeto de componente distribuído, é importante que sua interface personalizada seja remota, mesmo que você pretenda usá-la apenas no processo.

MIDL é mais do que apenas uma maneira de gerar arquivos de cabeçalho para suas interfaces. É uma linguagem de programação para comunicação remota que permite que você use suas interfaces através de limites de máquina, processo e thread. Isso significa que você precisa verificar o comportamento de suas interfaces definidas por MIDL nessas condições antes de liberar seu programa para os clientes. Se você cometeu um erro em seu IDL e a interface não está remota corretamente, pode ser difícil remediar esse erro. Ou você tem que revisar sua interface com um novo IID e deixar o antigo para compatibilidade com versões anteriores ou você tem que converter todos os clientes e todas as máquinas de servidor em todos os lugares ao mesmo tempo.

Mesmo que sua interface nunca seja usada fora do processo, ela pode ser usada cross-thread. O pior problema para um arquivo IDL não verificado pode surgir para servidores em processo que não oferecem suporte a vários apartamentos de thread único). Um servidor que não especifica um modelo de threading é implicitamente single-threaded. Tudo marcado como single-threaded é forçado para o thread que primeiro chamou CoInitialize ou CoInitializeEx. Se algum outro thread foi o que ativou o objeto, todas as interfaces nesse servidor de thread único devem ser remotas de volta para o thread de ativação, o que pode resultar em um retorno de REGDB_E_IIDNOTREG em resposta a uma chamada para QueryInterface). A menos que você possa afirmar absolutamente que sua interface está em processo e sempre será chamada no mesmo thread, você será remoto em algum momento.

Finalmente, como um designer de interface, você precisa considerar como os aplicativos cliente usarão sua interface. Duas coisas, juntas, determinam se uma interface será eficiente através dos limites do processo e da máquina: a frequência das chamadas de método através do limite da interface e a quantidade de dados a serem transferidos em uma determinada chamada de método. Embora o COM torne as chamadas entre processos e entre redes transparentes para os programas, ele não pode tornar as chamadas de alta frequência e alta largura de banda eficientes em espaços de endereço. Em alguns casos, é mais apropriado projetar interfaces que normalmente serão implementadas apenas como servidores em processo, enquanto outras interfaces são mais apropriadas para uso remoto.