Dela via


Skapa den globala gränssnittstabellen

Använd följande anrop för att skapa det globala gränssnittstabellobjektet och hämta en pekare till IGlobalInterfaceTable:

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

Obs

När du skapar det globala gränssnittstabellobjektet med föregående anrop är det nödvändigt att länka till biblioteket uuid.lib. Detta löser de externa symbolerna CLSID_StdGlobalInterfaceTable och IID_IGlobalInterfaceTable.

 

Det finns en enda instans av den globala gränssnittstabellen per process, så alla anrop till den här funktionen i en process returnerar samma instans.

Efter anropet till funktionen CoCreateInstance registrerar du gränssnittet från lägenheten där det finns med ett anrop till metoden RegisterInterfaceInGlobal. Den här metoden tillhandahåller en cookie som identifierar gränssnittet och dess plats. En lägenhet som söker en pekare till det här gränssnittet anropar sedan metoden GetInterfaceFromGlobal med den här cookien, och implementeringen tillhandahåller sedan en gränssnittspekare till den anropande lägenheten. Om du vill återkalla gränssnittets globala registrering kan alla lägenheter anropa metoden RevokeInterfaceFromGlobal.

Ett enkelt exempel på hur du använder IGlobalInterfaceTable skulle vara när du vill skicka en gränssnittspekare på ett objekt i en enkeltrådad lägenhet (STA) till en arbetstråd i en annan lägenhet. I stället för att behöva konvertera den till en ström och skicka dataströmmen till arbetstråden som en trådparameter kan du IGlobalInterfaceTable helt enkelt skicka en cookie.

När du registrerar gränssnittet i den globala gränssnittstabellen får du en cookie som du kan använda i stället för att skicka själva pekaren (när du behöver skicka pekaren), antingen till en icke-metodparameter som ska till ett annat lägenhetsutrymme (som parameter till ThreadProc via CreateThread) eller till internprocessminne som är tillgängligt utanför ditt lägenhetsutrymme.

Försiktighet krävs eftersom användning av globala gränssnitt lägger den extra bördan på programmeraren att hantera problem som rasförhållanden och ömsesidig uteslutning, som är associerade med åtkomst till global stat från flera trådar samtidigt.

COM tillhandahåller en standardimplementering av gränssnittet IGlobalInterfaceTable. Vi rekommenderar starkt att du använder den här standardimplementeringen eftersom den ger kompletta trådsäkra funktioner.

När du ska använda den globala gränssnittstabellen