【问题标题】:Where do I need to switch the Activation Context?我需要在哪里切换激活上下文?
【发布时间】:2013-10-18 10:16:54
【问题描述】:

我面临的问题本质上是described here,即:

  • 我的 DLL 正在使用第 3 方进程内 COM 组件 dll。
  • 我想将免注册 COM 与该进程内组件一起使用。
  • 我想在这个 DLL 中(而不是在主 EXE 中)嵌入并使用一个 manfest,这样我就可以以无 reg 的方式使用第 3 方组件。
  • 我在组件中使用的接口是通过调用CoCreateInstance 来激活的。
  • 第 3 方 COM 组件没有任何进一步的 (COM) 依赖项,不需要依赖或隔离。

我发现简单地将清单嵌入到我的 DLL 中是行不通的,如链接问题中所述,我需要手动切换 Activation Context

我不明白的是在哪里以及何时需要切换激活上下文:我是否只需要将我对CoCreateInstance 的调用包装成CActCtxActivator ScopedContext(*) 之类的东西,或者我需要将所有调用包装到第 3 方组件中吗? (据我所知,ISOLATION_AWARE_ENABLED 应该提供帮助。)

那么,在使用免注册COM的时候,需要在哪里切换Activation Context呢?


(*) : AFX_MANAGE_STATE(AfxGetStaticModuleState());(**) 或其他。


(**):实际上,AFX_MANAGE_STATE 曾经可以工作,但在“较新”的 MFC 版本中不再可用。见,例如VS2012: Removed support for active contexts switching in MFC?:

我们从 MFC 中删除了所有激活上下文支持,因为我们 .... 我们使用 Windows MFC 本身内部的隔离感知 API。

// 发布者:Pat Brenner,Visual C++ 库开发:2013 年 6 月 5 日星期三晚上 11:10

【问题讨论】:

  • 包装 CoCreateInstance 就足够了

标签: winapi com side-by-side regfreecom activation-context-api


【解决方案1】:

您只需要将调用封装到CoCreateInstance,因为第 3 方组件没有其他依赖项。

如果它有其他依赖项,那么您需要将调用包装到第 3 方组件中。

【讨论】:

  • "... 那么您需要将呼叫包装到第 3 方..." - 也就是说,那些本身需要切换的激活上下文的呼叫,即那些将触发(类似于)CoCreateInstance 本身以及我希望通过切换上下文解决这些依赖关系的位置?
  • @MartinBa 没错。我假设您并不总是知道哪些调用需要切换上下文,并且将它们全部包装起来是最安全的。
猜你喜欢
  • 2010-11-24
  • 2021-08-29
  • 2015-10-19
  • 2012-11-18
  • 2018-04-15
  • 2018-06-22
  • 2015-12-10
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多