Где мне нужно переключить контекст активации?
Проблема, с которой я сталкиваюсь, в сущности описана здесь, а именно:
- У меня есть 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
с учетом того, что сторонний компонент не имеет других зависимостей.
Если бы у него были другие зависимости, то вам нужно было бы обернуть вызовы в сторонний компонент.