Udostępnij przez


Używanie wywołań zwrotnych z hostowanych składników

Wywołania zwrotne z hostowanych składników są kluczowe dla umożliwienia hostingu. Istnieje jednak możliwość, że hostowany składnik aktywował inny kontekst aktywacji używany do uzyskiwania dostępu do wtyczek lub składników własnych. W takim przypadku, jeśli hostowany składnik opuści kontekst aktywacji na stosie, który odwołuje się do własnego obiektu COM, aplikacja hostingowa może wywołać CoCreateInstance, aby uzyskać obiekt, który oczekuje się, że będzie jego własną implementacją, a zamiast tego otrzyma obiekt hostowanego składnika. Aby zapobiec dziedziczeniu tych kontekstów aktywacji, dobre aplikacje hostingu powinny najpierw aktywować swój dobrze znany kontekst aktywacji podczas wywołania zwrotnego.

Rozważmy następujący przykład, który chroni kod aplikacji hostingu:

HRESULT STDCALL 
CHostingAppFirewall::ITheInterface::FunctWrapper()
{
    ULONG_PTR ulpCookie;
    HRESULT hRes = E_FAIL;
    if (!ActivateActCtx(this->m_hHostingAppContext, &ulpCookie))
        return HRESULT_FROM_WIN32(GetLastError());
    __try 
        {
        hRes = this->m_ITheInterface->Funct();
    } 
        __finally 
        {
        if (!DeactivateActCtx(0, ulpCookie))
            hRes = HRESULT_FROM_WIN32(GetLastError());
    }
    return hRes;
}

Zapewnia to ustawienie odpowiedniego kontekstu aktywacji przed przekazaniem żądania do wewnętrznej implementacji Funct. Twoja własna implementacja może mieć rzeczywistą implementację w kodzie, ale poprzednia metoda zapewnia łatwiejsze współdziałanie poprzez tworzenie delegowanych otok. Zaleca się użycie podobnej metody podczas udostępniania normalnych wywołań zwrotnych (innych niż COM).