Partilhar via


Quando usar a tabela de interface global

Ao desserializar um apontador de interface várias vezes entre apartamentos num processo, poderá usar a interface IGlobalInterfaceTable. Com outras técnicas, você teria que remarshal cada vez.

Observação

Se o ponteiro da interface for desempacotado apenas uma vez, convém usar a funçãoCoMarshalInterThreadInterfaceInStream. Ele também pode ser usado para passar um ponteiro de interface de um thread para outro thread no mesmo processo.

 

A interfaceIGlobalInterfaceTable também torna outro problema anteriormente difícil mais simples para o programador. Esse problema ocorre quando as seguintes condições se aplicam:

  • Um objeto ágil em processo agrega o marshaler de rosca livre.
  • Esse mesmo objeto ágil também mantém (como variáveis de membro) ponteiros de interface para outros objetos que não são ágeis e não agregam o marshaler de encadeamento livre.

Na presente situação, se o objeto externo for enviado para outro apartamento e a aplicação o chamar, e o objeto tentar chamar qualquer um dos seus ponteiros de interface que são membros de variáveis e que não são multithreaded ou são proxies para objetos em outros apartamentos, ele pode obter resultados incorretos ou o erro RPC_E_WRONG_THREAD. Este erro ocorre porque a interface interna foi projetada para ser chamada somente a partir do apartamento em que foi armazenada pela primeira vez na variável membro.

Para resolver esse problema, o objeto externo que agrega o marshaler de thread livre deve chamar IGlobalInterfaceTable::RegisterInterfaceInGlobal na interface interna e armazenar o cookie resultante na sua variável membro, em vez de armazenar o ponteiro de interface real. Quando o objeto externo quiser chamar o ponteiro de interface de um objeto interno, ele deve chamar IGlobalInterfaceTable::GetInterfaceFromGlobal, usar o ponteiro de interface retornado e liberá-lo. Quando o objeto externo desaparece, ele deve chamar IGlobalInterfaceTable::RevokeInterfaceFromGlobal para remover a interface da tabela de interface global.

Criando a tabela de interface global