Creazione della tabella dell'interfaccia globale

Usare la chiamata seguente per creare l'oggetto tabella di interfaccia globale e ottenere un puntatore 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

Quando si crea l'oggetto tabella di interfaccia globale usando la chiamata precedente, è necessario collegarsi alla libreria uuid.lib. Verranno risolti i simboli esterni CLSID_StdGlobalInterfaceTable e IID_IGlobalInterfaceTable.

 

Esiste una singola istanza della tabella dell'interfaccia globale per processo, quindi tutte le chiamate a questa funzione in un processo restituiscono la stessa istanza.

Dopo la chiamata alla funzione CoCreateInstance, registrare l'interfaccia dall'apartment in cui risiede con una chiamata al metodo RegisterInterfaceInGlobal. Questo metodo fornisce un cookie che identifica l'interfaccia e la relativa posizione. Un appartamento che cerca un puntatore a questa interfaccia chiama quindi il metodo GetInterfaceFromGlobal con questo cookie e l'implementazione fornisce quindi un puntatore di interfaccia all'apartment chiamante. Per revocare la registrazione globale dell'interfaccia, qualsiasi apartment può chiamare il metodo RevokeInterfaceFromGlobal.

Un semplice esempio di utilizzo di IGlobalInterfaceTable è quando si vuole passare un puntatore di interfaccia su un oggetto in un apartment a thread singolo (STA) a un thread di lavoro in un altro apartment. Invece di dover effettuare il marshalling in un flusso e passare il flusso al thread di lavoro come parametro di thread, IGlobalInterfaceTable consente semplicemente di passare un cookie.

Quando si registra l'interfaccia nella tabella dell'interfaccia globale, si ottiene un cookie che è possibile usare invece di passare il puntatore effettivo (ogni volta che è necessario passare il puntatore), a un parametro non metod che passa a un altro apartment (come parametro di ThreadProc tramite CreateThread) o alla memoria in-process accessibile all'esterno dell'apartment.

È necessario prestare attenzione perché l'uso di interfacce globali comporta il carico aggiuntivo per il programmatore della gestione di problemi come le race condition e l'esclusione reciproca, associate all'accesso allo stato globale da più thread contemporaneamente.

COM fornisce un'implementazione standard dell'interfaccia IGlobalInterfaceTable . È consigliabile usare questa implementazione standard perché offre funzionalità thread-safe complete.

Quando usare la tabella dell'interfaccia globale