Compartir a través de


Creación de la tabla de interfaz global

Use la siguiente llamada para crear el objeto de tabla de interfaz global y obtener un puntero a IGlobalInterfaceTable:

HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
                 NULL,
                 CLSCTX_INPROC_SERVER,
                 IID_IGlobalInterfaceTable,
                 (void **)&gpGIT);
if (hr != S_OK) {
  exit(0); // Handle errors here.
}

Nota

Al crear el objeto de tabla de interfaz global mediante la llamada anterior, es necesario vincular a la biblioteca uuid.lib. Esto resolverá los símbolos externos CLSID_StdGlobalInterfaceTable y IID_IGlobalInterfaceTable.

 

Hay una única instancia de la tabla de interfaz global por proceso, por lo que todas las llamadas a esta función en un proceso devuelven la misma instancia.

Después de la llamada a la función CoCreateInstance , registre la interfaz desde el apartamento en el que reside con una llamada al método RegisterInterfaceInGlobal . Este método proporciona una cookie que identifica la interfaz y su ubicación. Un apartamento que busca un puntero a esta interfaz llama al método GetInterfaceFromGlobal con esta cookie, y la implementación proporciona un puntero de interfaz al apartamento que realiza la llamada. Para revocar el registro global de la interfaz, cualquier apartamento puede llamar al método RevokeInterfaceFromGlobal .

Un ejemplo sencillo de uso de IGlobalInterfaceTable sería cuando desea pasar un puntero de interfaz en un objeto de un apartamento de un solo subproceso (STA) a un subproceso de trabajo en otro apartamento. En lugar de tener que serializarla en una secuencia y pasarla al subproceso de trabajo como parámetro de subproceso, IGlobalInterfaceTable le permite pasar simplemente una cookie.

Al registrar la interfaz en la tabla de interfaz global, obtiene una cookie que puede usar en lugar de pasar el puntero real (siempre que necesite pasar el puntero), ya sea a un parámetro no method que vaya a otro apartamento (como parámetro a ThreadProc a través de CreateThread) o a la memoria en proceso accesible fuera de su apartamento.

Es necesario tener cuidado porque el uso de interfaces globales pone la carga adicional al programador de administrar problemas como condiciones de carrera y exclusión mutua, que están asociados con el acceso al estado global desde varios subprocesos simultáneamente.

COM proporciona una implementación estándar de la interfaz IGlobalInterfaceTable . Se recomienda encarecidamente usar esta implementación estándar porque proporciona una funcionalidad completa segura para subprocesos.

Cuándo usar la tabla de interfaz global