Delen via


De algemene interfacetabel maken

Gebruik de volgende oproep om het wereldwijde interfacetabelobject te maken en een pointer op te halen naar IGlobalInterfaceTable:

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

Notitie

Wanneer u het globale interfacetabelobject maakt met behulp van de voorgaande aanroep, moet u een koppeling maken naar de bibliotheek uuid.lib. Hiermee worden de externe symbolen CLSID_StdGlobalInterfaceTable en IID_IGlobalInterfaceTable opgelost.

 

Er is één exemplaar van de globale interfacetabel per proces, dus alle aanroepen naar deze functie in een proces retourneren hetzelfde exemplaar.

Na de aanroep van de CoCreateInstance functie, registreert u de interface van het appartement waarin deze zich bevindt met een aanroep naar de methode RegisterInterfaceInGlobal. Deze methode levert een cookie die de interface en de locatie identificeert. Een appartement op zoek naar een aanwijzer naar deze interface roept vervolgens de GetInterfaceFromGlobal methode aan met deze cookie en de implementatie levert vervolgens een interfaceaanwijzer naar het aanroepende appartement. Als u de globale registratie van de interface wilt intrekken, kan elk appartement de methode RevokeInterfaceFromGlobal aanroepen.

Een eenvoudig voorbeeld van het gebruik van IGlobalInterfaceTable is wanneer u een interfacepointer van een object in een single-thread-apartment (STA) wilt doorgeven aan een werkthread in een ander apartment. In plaats van deze in een stream te moeten plaatsen en de stream als threadparameter door te geven aan de werkdraad, kunt u met IGlobalInterfaceTable eenvoudig een cookie doorgeven.

Wanneer u de interface registreert in de globale interfacetabel, krijgt u een cookie die u kunt gebruiken in plaats van de werkelijke aanwijzer door te geven (wanneer u de aanwijzer moet doorgeven), naar een niet-methodparameter die naar een ander appartement gaat (als parameter voor het ThreadProc- via CreateThread) of om in-process geheugen toegankelijk buiten uw appartement te maken.

Zorg is vereist omdat het gebruik van globale interfaces de extra last vormt van de programmeur voor het beheren van problemen, zoals racevoorwaarden en wederzijdse uitsluiting, die zijn gekoppeld aan de toegang tot de globale status van meerdere threads tegelijk.

COM biedt een standaard implementatie van de interface IGlobalInterfaceTable. Het wordt ten zeerste aanbevolen deze standaard implementatie te gebruiken, omdat het volledige thread-veilige functionaliteit biedt.

Wanneer gebruikt u de globale interfacetabel