如何在插件架构中进行免注册COM

时间:2009-11-20 13:36:31

标签: com plugins wix regfreecom

我们使用清单文件来执行免注册COM,正如我在this other question中所详述的那样。

现在我们尝试将免注册COM与支持插件的应用程序一起使用。插件是OCX文件,可以在安装主应用程序后添加到主应用程序的文件夹中。

但是,这意味着主应用程序的清单文件需要由插件安装程序进行修补。这似乎是一件危险且容易出错的事情,特别是如果可以安装多个插件的话。

有没有办法以某种方式拆分主应用程序的清单文件,以便每个插件可以安全地将它自己的部分作为单独的文件添加?或者另一种修补清单文件的安全方法?

如果相关:我们使用wix创建我们的安装程序。

2 个答案:

答案 0 :(得分:6)

我不建议修改应用程序的清单文件;这似乎相当脆弱,只有当它存在于可写的位置时才会起作用。

在进程启动时,应用程序的清单用于生成“激活上下文”,该“激活上下文”作为进程范围的激活上下文被推送。但每个线程也有一个激活上下文堆栈,可以直接操作。给定线程上的操作在查找COM注册数据时查看堆栈的最上层上下文和进程范围的激活上下文。

建议任何时候插件代码需要调用COM,应该在线程上激活特定于插件的清单。这可以通过以下两种方式之一轻松完成:

  1. 将插件特定的清单作为ID2清单嵌入到插件中,并使用定义的宏ISOLATION_AWARE_ENABLED进行编译。这基本上包含需要来自清单的上下文的常见Windows API,以自动激活和停用呼叫周围的正确激活上下文。

  2. 激活/取消激活插件中所有入口点周围线程的正确激活上下文。这是通过activation context APIs完成的。使用激活context management object即可轻松完成此操作。

答案 1 :(得分:4)

如果您使用的是.Net,则可以使用此答案中显示的the code来处理激活上下文。