Compartir a través de


Cuándo usar la tabla de interfaz global

Si estás desacoplar un puntero de interfaz varias veces entre apartamentos en un proceso, puedes usar la interfaz IGlobalInterfaceTable . Con otras técnicas, tendrías que volver a casar cada vez.

Nota

Si el puntero de la interfaz se desenlace solo una vez, es posible que desee usar la función CoMarshalInterThreadInterfaceInStream . También se puede usar para pasar un puntero de interfaz de un subproceso a otro subproceso en el mismo proceso.

 

La interfaz IGlobalInterfaceTable también simplifica otro problema anteriormente difícil para el programador. Este problema se produce cuando se aplican las condiciones siguientes:

  • Un objeto ágil en proceso agrega el serializador de subprocesos libres.
  • Este mismo objeto ágil también contiene punteros de interfaz (como variables miembro) a otros objetos que no son ágiles y no agregan el serializador de subprocesos libres.

En esta situación, si el objeto externo se serializa en otro apartamento y la aplicación llama a en él, y el objeto intenta llamar a en cualquiera de sus punteros de interfaz de variable miembro que no están en subproceso libre o son servidores proxy a objetos de otros apartamentos, podría obtener resultados incorrectos o el error RPC_E_WRONG_THREAD. Este error se produce porque la interfaz interna está diseñada para ser invocable solo desde el apartamento en el que se almacenó por primera vez en la variable miembro.

Para resolver este problema, el objeto externo que agregación del serializador de subprocesos libre debe llamar a IGlobalInterfaceTable::RegisterInterfaceInGlobal en la interfaz interna y almacenar la cookie resultante en su variable miembro, en lugar de almacenar el puntero de interfaz real. Cuando el objeto externo quiere llamar a en el puntero de interfaz de un objeto interno, debe llamar a IGlobalInterfaceTable::GetInterfaceFromGlobal, usar el puntero de interfaz devuelto y, a continuación, liberarlo. Cuando el objeto externo desaparece, debe llamar a IGlobalInterfaceTable::RevokeInterfaceFromGlobal para quitar la interfaz de la tabla de interfaz global.

Creación de la tabla de interfaz global