Manipuladores leves do lado do cliente permitem que você crie manipuladores gerais do lado do cliente de qualquer tamanho, para ajudá-lo a fazer qualquer tipo de tarefa padrão. Como manipuladores, eles são utilizáveis por mais de um cliente. Eles diferem dos manipuladores OLE porque não podem ser criados antes que o servidor seja iniciado e seu tempo de vida esteja vinculado ao do gerenciador de proxy, impedindo uma possível condição de corrida na qual o manipulador poderia ser liberado prematuramente.
O gerenciador de proxy é o objeto criado pelo sistema que implementa a interface IMarshal. Se você usar marshaling padrão, o sistema o criará para você quando você chamar CoGetStandardMarshal (ou CoGetStdMarshalEx, para criar um marshaler agregado para manipuladores leves) e também implementará as interfaces IClientSecurity e IMultiQI no objeto. No lado do servidor, há um objeto de sistema correspondente que também implementa o IMarshal. Esses objetos lidam com marshaling para você de forma transparente.
Há dois tipos gerais desses manipuladores que você pode querer implementar:
Um manipulador que executa um serviço que não requer dados extras do servidor
Um manipulador que usa dados extras do servidor
Alguns usos potenciais dos dados extras no fluxo fornecido pelo servidor são os seguintes:
Dados estáticos do servidor. Independentemente da interface específica que está sendo empacotada, o servidor grava os mesmos dados no fluxo.
Dados por interface do servidor. Dependendo de qual interface específica está sendo empacotada, o servidor pode gravar dados diferentes no fluxo.
Ajudantes por interface. Componentes COM por interface agregados ao manipulador do cliente e delegados ao proxy padrão. Por exemplo, para melhorar o desempenho da rede, um componente COM para IStream poderia fazer cache de dados do lado do cliente, read-ahead, write-behind, op-locking e assim por diante.
Versão de rede de uma interface. A versão de rede da interface é diferente da interface exposta pelo código do aplicativo cliente e servidor. É possível, por exemplo, multiplexar interfaces expostas IA e IB sobre a mesma interface de rede INetAB, da mesma forma que o manipulador de servidor de incorporação. Por exemplo, pode-se converter uma interface de transferência de dados em uma interface de rede que usa pipes para transferência de dados eficiente.
Os clientes de nível inferior podem não ter a capacidade de desempacotar interfaces que tenham manipuladores personalizados, por dois motivos: primeiro, eles podem não entender o CLSID usado no pacote empacotado personalizado quando o manipulador de servidor é agregado e o objeto deseja um manipulador. Em segundo lugar, o código do manipulador pode nem mesmo ser executado no lado do cliente se ele exigir nova funcionalidade do COM para criar o marshaler padrão agregado e fazer chamadas QueryInterface remotas.
Você pode criar aplicativos sem servidor usando quase qualquer linguagem de programação que dê suporte a primitivos HTTP. Usando manipuladores personalizados, você pode escolher um runtime que te atenda.