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