Dela via


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

Om du tar bort en gränssnittspekare flera gånger mellan lägenheter i en process kan du använda gränssnittet IGlobalInterfaceTable. Med andra tekniker skulle du behöva gifta om varje gång.

Notis

Om gränssnittspekaren bara är omarshalerad en gång kanske du vill använda funktionen CoMarshalInterThreadInterfaceInStream. Den kan också användas för att skicka en gränssnittspekare från en tråd till en annan tråd i samma process.

 

Gränssnittet IGlobalInterfaceTable gör också ett annat tidigare svårt problem enklare för programmeraren. Det här problemet uppstår när följande villkor gäller:

  • Ett agilt objekt i processen aggregerar den fritrådade marskalkaren.
  • Detta agila objekt innehåller även som medlemsvariabler gränssnittspekare till andra objekt som inte är agila och som inte använder den fritrådade marshallern.

Om det yttre objektet i detta fall överförs till en annan lägenhet och programmet anropar det, och objektet försöker anropa någon av dess medlemsvariabelgränssnittpekare som inte är trådfria eller är proxys till objekt i andra lägenheter, kan det få felaktiga resultat eller felet RPC_E_WRONG_THREAD. Det här felet beror på att det inre gränssnittet är utformat för att endast vara anropsbart från den lägenhet där det först lagrades i medlemsvariabeln.

För att lösa det här problemet bör det yttre objektet som aggregerar den fritrådade marskalken anropa IGlobalInterfaceTable::RegisterInterfaceInGlobal på det inre gränssnittet och lagra den resulterande cookien i dess medlemsvariabel, i stället för att lagra den faktiska gränssnittspekaren. När det yttre objektet vill anropa ett inre objekts gränssnittspekare bör det anropa IGlobalInterfaceTable::GetInterfaceFromGlobal, använda den returnerade gränssnittspekaren och sedan släppa den. När det yttre objektet försvinner bör det anropa IGlobalInterfaceTable::RevokeInterfaceFromGlobal för att ta bort gränssnittet från den globala gränssnittstabellen.

Skapa den globala gränssnittstabellen