Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Para criar uma instância do manipulador, se ela não obtiver dados extras do servidor, o servidor deverá implementar IStdMarshalInfo, mas não IMarshal. IStdMarshalInfo tem um método, GetClassForHandler, que recupera o CLSID do manipulador de objeto a ser usado no processo de destino. COM chama isso quando chama CoMarshalInterface para você e ativa o manipulador no lado do cliente.
Em seguida, as implementações de servidor e manipulador devem chamar a função CoGetStdMarshalEx. Essa função cria um marshaler padrão em cada lado (chamado de gerenciador de proxy no lado do cliente e um gerenciador de stub no lado do servidor).
O servidor chama CoGetStdMarshalEx, passando o sinalizador SMEXF_SERVER. Isso cria um marshaler padrão do lado do servidor (gerenciador de stub). A estrutura do lado do servidor é mostrada na ilustração a seguir:

Estrutura do lado do servidor
O manipulador chama CoGetStdMarshalEx, passando o sinalizador SMEXF_HANDLER. Isso cria um marshaler padrão do lado do cliente (gerenciador de proxy) e o agrega com o manipulador no lado do cliente. O tempo de vida de ambos é gerenciado pelo objeto de identidade de controle (implementando IUnknown) que o sistema implementa quando o manipulador chama CoGetStdMarshalEx. A estrutura do lado do cliente é mostrada na ilustração a seguir.

Estrutura do lado do cliente
Como mostrado na ilustração anterior, o manipulador é na verdade ensanduichado entre o gerenciador de proxy e a identidade/controle desconhecido. Isso dá ao sistema controle sobre a vida útil do objeto, ao mesmo tempo em que dá ao manipulador controle sobre as interfaces expostas. A linha tracejada entre o Identity e o Proxy Manager indica que os dois compartilham uma integração estreita por meio de interfaces privadas internas.
Quando o COM chama CoUnmarshalInterface para o cliente, ele cria a instância do manipulador, agregando-a com a Identidade. O manipulador criará o marshaler padrão (por meio da chamada para CoGetStdMarshalEx, passando o controle desconhecido que recebeu quando foi criado). O manipulador não implementa IMarshal , mas apenas retorna IMarshal do marshaler padrão. Mesmo que o manipulador implemente o IMarshal, ele não será chamado durante um unmarshal.
Se dois threads desmarshal simultaneamente o mesmo objeto pela primeira vez, é possível que dois manipuladores sejam criados temporariamente. Um deles será liberado posteriormente.
Tópicos relacionados