IMarshal
9/8/2008
Essa interface permite que um objeto COM para definir e gerenciar o empacotamento de seus ponteiros interface. O alternativo é usar implementação usar como padrão do COM, a escolha preferencial em casos especiais all but a few (consulte para implementar a seção).
Empacotamento é o processo de empacotamento dados em pacotes para transmissão para um processo diferente ou máquina. Unmarshaling é o processo de recuperação que dados no final de recebimento. Em qualquer dado chamar, método argumentos são empacotados e unmarshaled em uma direção, enquanto os valores de retorno são empacotados e unmarshaled no outro.
Embora empacotamento se aplica a todos os tipos dados, ponteiros interface exigem manipulação especial. O problema fundamental é como código do cliente execução em um espaço de endereço pode corretamente excluir a referência um ponteiro para uma interface em um objeto que residem em um espaço de endereço diferentes.
Solução do COM é para um aplicativo cliente para se comunicar com o original objeto através de um objeto substituto, ou proxy, que reside no processo do cliente. O proxy contém uma referência a uma interface sobre a original objeto e passa o cliente um ponteiro para uma interface em si.
Quando o cliente chama um método interface sobre a original objeto, sua chamar realmente será o proxy. Portanto, a partir apontar do cliente da exibição, todas as chamadas são in-processo.
Em receber um chamar, o proxy controla os argumentos método e, por alguns significa de entre processos comunicação, such as RPC, passa junto ao codificar no processo de servidor, que unmarshals os argumentos e passa-los para o original objeto.
Essa mesma codificar controla valores de retorno para transmissão voltar para o proxy, que unmarshals os valores e passa-los para o aplicativo cliente.
IMarshal Fornece métodos para criar, inicializar e gerenciando um proxy em um processo cliente; Ele não determinam como o proxy deve se comunicar com o original objeto. Implementação usar como padrão do COM de IMarshal Usa RPC.
Quando você implementar essa interface você mesmo, você está livre para escolher qualquer método de entre processos comunicação você deem ser apropriado para seu aplicativo — compartilhado memória, janela identificador, RPC — em resumo, tudo o que funciona.
Quando a implementar
Implementar IMarshal Somente quando você acha que você pode perceber otimizações significativas para implementação usar como padrão do COM. Na prática, este será raramente a maiúsculas e minúsculas. No entanto, há ocasiões em que a implementação IMarshal Pode ser preferencial:
- Os objetos estiver escrevendo manter seu estado na memória compartilhada. Neste maiúsculas e minúsculas, ambos os o original processo e o processo cliente usa proxies que referir para a memória compartilhada.
Esse tipo de empacotamento personalizado é possível somente se o processo cliente estiver na mesma máquina como o original processo. Fornecido com implementações de IStorage e IStream São exemplos desse tipo de empacotamento personalizado. - Os objetos estiver escrevendo são imutável, que é, seu estado não alteração após a criação. Em vez de encaminhar chamadas método para o original objetos, você simplesmente criar cópias desses objetos no processo de cliente.
Essa técnica impede o custo de alternar de um processo para outro. Alguns monikers são exemplos de imutável objetos; Se você estiver implementando sua classe moniker, você deve avaliar os custos e vantagens de implementação IMarshal Em seus objetos moniker. - Objetos que próprios são objetos proxy podem usar empacotamento personalizado para evitar a criação proxies para proxies. Em vez disso, o proxy existente pode referir novo proxies voltar para o original objeto.
Essa funcionalidade é importante para fins de tanto eficiência e robustez. - O aplicativo servidor deseja gerenciar como as chamadas são feitas através de rede sem afetar a interface exposto a clientes.
De exemplo, se um usuário estava fazendo alterações para um registro banco de dados, o servidor pode desejar para armazenar em cache as alterações até que o usuário foi confirmada-as, no qual tempo a transação inteira deve ser encaminhada em um único pacote. Usando um personalizado proxy deve habilitar o cache e geração de lotes de alterações dessa maneira.
Quando você escolher para implementar IMarshal, você deve fazer isso para dois seu original objeto e o proxy você cria para ele. Ao implementar a interface no objeto ou proxy, você simplesmente retorna E_NOTIMPL para os métodos que não são implementados.
COM usa a implementação de IMarshal No seguinte maneira:
- Quando é necessário criar um remoto ponteiro interface para o objeto (isto é, quando um ponteiro para o objeto é passado como um argumento em um remoto chamar função), COM consultas seu objeto para o IMarshal interface.
- Se o objeto implementa-lo, COM usa seu IMarshal implementação para criar o objeto proxy.
- Se o objeto não implementar IMarshal, COM usa sua implementação usar como padrão.
Como você estrutura o proxy é o Backup para você:
- Você pode escrever o proxy usar qualquer mecanismos você deem apropriado para a comunicação com o original objeto.
- Você também pode criar o proxy como um autônomo objeto ou como parte de um maior agregação such as um manipulador.
No entanto você escolher a estrutura de proxy, ele deve implementar IMarshal Para trabalho em todos os. Você também deve gerar um CLSID para o proxy a ser retornada por sua implementação de IMarshal::GetUnmarshalClass sobre a original objeto.
Quando usar
COM chama essa interface como parte do suporte empacotamento System-provided. Chamadas do COM são ajustada em chamadas para CoMarshalInterface e CoUnmarshalInterface.
Seu será geralmente codificar não necessário para chamar essa interface. Circunstâncias especiais onde você pode escolher fazer para que são discutidas as notas para seção chamadores para cada método.
Métodos na ordem TabelaV
Método IUnknown | Descrição |
---|---|
Retorna os ponteiros para com suporte interfaces. |
|
Incrementa a contagem de referência. |
|
Diminui o contagem de referência. |
Método | Descrição |
---|---|
Retorna CLSID de desempacotamento codificar. |
|
Retorna tamanho da reserva necessária durante empacotamento. |
|
Controla um ponteiro interface. |
|
Unmarshals um ponteiro interface. |
|
Destrói um pacote de dados empacotado. |
|
Servidores todas as conexões. |
Remarks
Para determinar se a plataforma oferece suporte a esta interface, consulte Determinando suporte COM APIs.
Requisitos
Header | objidl.h, objidl.idl |
Library | ole32.lib, uuid.lib |
Windows Embedded CE | Windows CE 3.0 and later |
Windows Mobile | Windows Mobile Version 5.0 and later |