Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Als u een interfaceaanwijzer meerdere keren tussen appartementen in een proces loskoppelt, kunt u de interface IGlobalInterfaceTable gebruiken. Met andere technieken zou u elke keer opnieuw moeten marshalen.
Notitie
Als de interfacepointer slechts één keer wordt gedemarshalled, kunt u de functie CoMarshalInterThreadInterfaceInStream gebruiken. Het kan ook worden gebruikt om een interfaceaanwijzer van de ene thread door te geven aan een andere thread in hetzelfde proces.
De IGlobalInterfaceTable interface maakt ook een eerder moeilijk probleem eenvoudiger voor de programmeur. Dit probleem treedt op wanneer de volgende voorwaarden van toepassing zijn:
- Een in-process agile object aggregeert de free-threaded marshaler.
- Hetzelfde agile-object bevat ook interfacepunten (als lidvariabelen) naar andere objecten die niet flexibel zijn en die de free-threaded marshaler niet aggregeren.
In deze situatie, als het externe object wordt verplaatst naar een ander appartement en de applicatie erop aanroept, en het object probeert een van zijn lidvariabele-interfacepointers aan te roepen die niet vrij-threaded zijn of proxy's zijn voor objecten in andere appartementen, kan het onjuiste resultaten geven of de fout RPC_E_WRONG_THREAD opleveren. Deze fout treedt op omdat de binnenste interface alleen kan worden aangeroepen vanuit het appartement waarin het voor het eerst in de lidvariabele is opgeslagen.
Om dit probleem op te lossen, moet het buitenste object dat de free-threaded marshaler samenvoegt IGlobalInterfaceTable::RegisterInterfaceInGlobal op de binnenste interface aanroepen en de resulterende cookie opslaan in de lidvariabele, in plaats van de werkelijke interfacepointer op te slaan. Wanneer het buitenste object de interfaceaanwijzer van een inner object wil aanroepen, moet het IGlobalInterfaceTable::GetInterfaceFromGlobalaanroepen, de geretourneerde interfaceaanwijzer gebruiken en het vervolgens vrijgeven. Wanneer het buitenste object verdwijnt, moet het IGlobalInterfaceTable::RevokeInterfaceFromGlobal aanroepen om de interface uit de globale interfacetabel te verwijderen.
Verwante onderwerpen