Поделиться через


Использование обратных вызовов из размещенных компонентов

Обратные вызовы из размещенных компонентов — это то, что делает возможным размещение. Однако вполне возможно, что размещаемые компоненты активировали другой контекст активации, который используется для доступа к подключаемым модулям или компонентам. В этом случае, если размещенный компонент оставляет контекст активации в стеке, который ссылается на собственный 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) обратных вызовов.