Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Retornos de chamada de componentes hospedados são o que tornam a hospedagem possível. No entanto, é possível que o componente que você está hospedando tenha ativado outro contexto de ativação que ele usa para acessar plug-ins ou componentes próprios. Nesse caso, se o componente hospedado deixar um contexto de ativação na pilha que se refira ao seu próprio objeto COM, o aplicativo anfitrião poderá chamar CoCreateInstance para obter um objeto que espera ser sua própria implementação e, em vez disso, receber o objeto do componente hospedado. Para evitar essa herança de contextos de ativação, uma boa aplicação de hospedagem deve ativar primeiro o seu próprio contexto de ativação bem conhecido durante um callback.
Considere o seguinte exemplo que protege o código do aplicativo de hospedagem:
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;
}
Isso garante que um contexto de ativação adequado seja definido antes de passar a solicitação para alguma implementação interna do Funct. Sua própria implementação pode ter a implementação real embutida, mas o método anterior garante uma interoperabilidade mais fácil apenas criando wrappers delegados. Recomenda-se usar um método semelhante ao expor retornos de chamada normais (não COM).