我们正在调整我们的客户端相对复杂的应用程序(ActiveX/.net/Delphi/C++/COM)以使用SxS实现非管理部署并与我们的产品的旧版本隔离。模拟SideBySide用于不在线ActiveX
我们几乎所有的proc组件都可以实现这个目标,比如我们的.net ui,Delphi ui和我们在proc中使用的COM服务器,通过组合一个清单文件来描述我们的进程使用的所有库,没有任何组件的客户注册(几乎)。
这里来的几乎是: 目前,我们的应用程序调用(从它的C++部分)一个超过ActiveX的ActiveX服务器(Delphi ActiveX EXE),它本身又调用另一组超出proc的ActiveX服务器(第三方插件,任何东西都在这里,Delphi,C++,只要它没有执行ActiveX EXE并实现我们的接口)。
As we know SxS不支持proc ActiveX服务器。而且我们不能像我们主流程中的proc com服务器那样使用这些对象,因为这需要对我们的应用程序进行重大改写,甚至是最坏的情况,第三方工具和供应商使用的面向公众的API的中断,api我们不能允许的休息。
我们偶然发现了this article,它描述了如何从单独的进程中运行的Internet Explorer窗口中提取IHTMLDocument2。这使我们想到了这种方法:
我们将创建一个辅助卫星应用程序/进程,它将在进程服务器中运行ActiveX。 然后,我们将使用LresultFromObject和ObjectFromLresult将ActiveX对象的引用从卫星应用程序传输到主应用程序进程。卫星应用程序将拥有自己的清单文件,这将允许它以SxS模式运行。
同样的方法将采取这种德尔福的ActiveX EXE和第三方AciveX EXE插件
有一个替代的解决方案,这对于目前我们还没有结束提出的解决方案更喜欢上面是使用之间的通信.net远程处理和.net com代理类来打开两个进程之间的通信通道,将com请求转换为.net远程处理,并在第二个进程中返回com。
所以问题来了:
- ,你怎么看待这种做法?
- 您是否看到更好的解决方案?
纠正我,如果我错了,但你的提议不使用ObjectFromLresult,因为我已经建议对吗? 关于CoRegisterClassObject,它到底在哪注册它,如果它没有在注册表中注册,即使它在清单中,我的应用程序如何能够使用CoCreateInstance找到它? – 2010-01-16 21:00:34
它没有。 CoCreateInstance()会在运行的对象表中找到它。 – 2010-01-16 22:25:01
非常感谢,如果不是为了您的帮助,它会让我很年轻。 – 2010-01-20 11:58:52