如何在插件体系结构中实现免注册COM

如何在插件体系结构中实现免注册COM,com,plugins,wix,regfreecom,Com,Plugins,Wix,Regfreecom,我们使用清单文件来实现免注册COM,我在中也详细介绍了这一点 现在,我们正在尝试将免注册COM与支持插件的应用程序一起使用。插件是OCX文件,可以在安装主应用程序后添加到主应用程序的文件夹中 但是,这意味着主应用程序的清单文件需要由插件安装程序进行修补。这似乎是一件危险且容易出错的事情,尤其是在可以安装多个插件的情况下 是否有办法以某种方式拆分主应用程序的清单文件,以便每个插件都可以安全地将自己的部分添加为单独的文件?还是另一种安全的方式来修补清单文件 如果相关:我们使用创建安装程序。我不建议修

我们使用清单文件来实现免注册COM,我在中也详细介绍了这一点

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

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

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


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

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

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

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

  • 将特定于插件的清单作为ID2清单嵌入插件,并使用定义的宏进行编译。这基本上包装了需要清单中的上下文来自动激活和停用调用周围适当的激活上下文的常见Windows API

  • 在插件的所有入口点周围的线程上激活/停用适当的激活上下文。这是通过。这是最容易通过激活完成的


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

    谢谢您,Eugene。您知道有哪种示例代码至少使用其中一种解决方案吗?谢谢。实际上,我是按照这里的指南和vvvsample中的示例代码来实现这一点的:但我必须将COM dll复制到与exe相同的目录中,这正是我试图避免的。我当前正在将外部清单的完整路径和测试目录的完整路径传递到CActCtxHandle.Create()(分别为“C:\Rel\MyCppTests.dll.manifest”和“C:\Rel”)。COM dll也驻留在“C:\Rel”中,但exe驻留在不同的目录中(例如“C:\TestRunner”)。有什么想法吗?