Compartir a través de


Uso de devoluciones de llamada de componentes hospedados

Las devoluciones de llamada de los componentes hospedados son lo que hace posible el hospedaje. Sin embargo, es posible que el componente que hospeda haya activado otro contexto de activación que usa para acceder a complementos o componentes propios. En este caso, si el componente hospedado deja un contexto de activación en la pila que hace referencia a su propio objeto COM, la aplicación de hospedaje podría llamar a CoCreateInstance para obtener un objeto que espera ser su propia implementación y, en su lugar, recibir el objeto del componente hospedado. Para evitar esta herencia de contextos de activación, una buena aplicación de hospedaje debe activar primero su propio contexto de activación conocido durante una devolución de llamada.

Considere el ejemplo siguiente que protege el código de la aplicación de hospedaje:

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;
}

Esto garantiza que se establezca un contexto de activación adecuado antes de pasar la solicitud a alguna implementación interna de Funct. Su propia implementación puede tener la implementación real insertada, pero el método anterior garantiza una interoperabilidad más sencilla mediante la creación de contenedores delegados. Se recomienda usar un método similar al exponer devoluciones de llamada normales (no COM).