Quando usar a Tabela de Interface Global

Se você estiver desempacotando um ponteiro de interface várias vezes entre apartamentos em um processo, você pode 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ção CoMarshalInterThreadInterfaceInStream. Ele também pode ser usado para passar um ponteiro de interface de um thread para outro thread no mesmo processo.

 

A interface IGlobalInterfaceTable 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 thread 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 thread livre.

Nessa situação, se o objeto externo for empacotado para outro apartamento e o aplicativo chamá-lo, e o objeto tentar chamar qualquer um de seus ponteiros de interface variável membro que não são free-threaded ou são proxies para objetos em outros apartamentos, ele pode obter resultados incorretos ou o erro RPC_E_WRONG_THREAD. Esse 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 de 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 em sua variável de membro, em vez de armazenar o ponteiro de interface real. Quando o objeto externo deseja 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