Где мне нужно переключить контекст активации?

Проблема, с которой я сталкиваюсь, в сущности описана здесь, а именно:

  • У меня есть DLL, которая использует сторонний внутрипроцессный COM-компонент DLL.
  • Я хочу использовать бесплатный COM регистрации с этим внутрипроцессным компонентом.
  • Я хочу встроить и использовать manfest в эту DLL (не в основной EXE), чтобы я мог использовать сторонний компонент без каких-либо ограничений.
  • Интерфейс, который я использую от компонента, активируется через вызов CoCreateInstance,
  • Сторонний компонент COM не имеет дальнейших (COM) зависимостей и не нуждается в изоляции и не нуждается в них.

Я вижу, что простое встраивание манифеста в мою DLL не работает, как описано в связанном вопросе, мне нужно будет переключить контекст активации вручную.

Что я не понимаю, так это где и когда мне нужно переключить контекст активации: мне нужно только обернуть мой вызов CoCreateInstance в чем-то вроде CActCtxActivator ScopedContext (*) или мне нужно будет обернуть все вызовы в сторонний компонент? (Который, насколько я понимаю, это то, что ISOLATION_AWARE_ENABLED должен помочь.)

Итак, при использовании свободной регистрации COM, где вам нужно переключить контекст активации?


(*): Или AFX_MANAGE_STATE(AfxGetStaticModuleState()); (**) или что угодно.


(**): На самом деле, AFX_MANAGE_STATE раньше работал, но больше не в "более новых" версиях MFC. См., Например, VS2012: удалена поддержка переключения активных контекстов в MFC?:

Мы удалили всю поддержку контекста активации из MFC, потому что мы.... Мы используем API, поддерживающие изоляцию Windows, внутри самого MFC.

// опубликовано: Пэт Бреннер, Разработка библиотек Visual C++: среда, 5 июня 2013 г., 23:10

1 ответ

Решение

Вам нужно только обернуть свой звонок CoCreateInstanceс учетом того, что сторонний компонент не имеет других зависимостей.

Если бы у него были другие зависимости, то вам нужно было бы обернуть вызовы в сторонний компонент.

Другие вопросы по тегам