使用来自托管组件的回调

托管组件的回调使托管成为可能。 但是,托管的组件可能已激活另一个激活上下文,该上下文用于访问其自己的插件或组件。 在这种情况下,如果托管组件在引用其自己的 COM 对象的堆栈上留下激活上下文,宿主应用程序可能会调用 CoCreateInstance 来获取它期望为自己的实现的对象,并改为接收托管组件的 对象。 若要防止这种激活上下文的继承,良好的托管应用程序应在回调期间首先激活其自己的已知激活上下文。

请考虑保护托管应用程序代码的以下示例:

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

这可确保在将请求传递到 Funct 的某个内部实现之前设置正确的激活上下文。 你自己的实现可以具有内联的实际实现,但前面的方法只需创建委托包装器即可确保更容易的互操作性。 在公开普通 (非 COM) 回调时,建议使用类似的方法。