为Out of Process ActiveX模拟SideBySide

时间:2010-01-14 21:29:20

标签: com manifest sxs side-by-side activex-exe

我们正在调整我们客户端相对复杂的应用程序(ActiveX / .net / Delphi / C ++ / COM),以使用SxS实现非管理员部署和与旧版本产品的隔离。

我们几乎所有的proc组件都实现了这个目标,例如我们的.net ui,Delphi ui,以及我们在proc中使用的COM服务器,它们组成了一个清单文件,描述了我们流程使用的所有库,没有在任何组件的客户端上注册(差不多)。

接下来几乎是: 目前,我们的应用程序调用(从它的c ++部分)一个proc ActiveX服务器(Delphi ActiveX EXE),它反过来调用另一组proc ActiveX服务器(第三方插件,任何东西都在这里,Delphi, C ++,任何东西,只要它超出proc ActiveX EXE并实现我们的接口)。

As we know SxS不支持proc ActiveX服务器。并且我们不能在主进程中的proc com服务器中使用这些对象,因为这需要对我们的应用程序进行重大改写,甚至最糟糕的是,我们的公共面向API的中断,这是由第三方工具和供应商使用的,api打破我们不能允许的。

我们偶然发现了this article,它描述了如何从单独进程中运行的Internet Explorer窗口中提取IHTMLDocument2。这让我们想到了这种方法:

我们将创建一个辅助卫星应用程序/进程,它将在进程服务器中运行ActiveX。 然后,我们将使用LresultFromObjectObjectFromLresult将ActiveX对象的引用从卫星应用程序传输到主应用程序进程。卫星应用程序将拥有自己的清单文件,允许它以SxS模式运行。

将采用相同的方法在此Delphi ActiveX EXE和第三方AciveX EXE插件之间进行通信

有一种替代解决方案,目前我们不喜欢上面提出的解决方案,即使用.net远程处理和.net com代理类来打开两个进程之间的通信通道,通过翻译com请求到.net远程处理,并回到第二个进程的com。

所以问题出现了:

  1. 您如何看待这种方法?
  2. 您是否看到了更好的解决方案?

2 个答案:

答案 0 :(得分:4)

有可能做到。需要什么:

  • 应用程序需要启动服务器本身而不是依赖COM来执行此操作。您不需要注册表提供的额外间接,只需使用CreateProcess()。
  • 服务器应使用CoRegisterClassObject()在其main()方法中注册其类工厂。
  • 重要提示:应将每个工厂使用的CLSID更改为每个服务实例的唯一IDSID。这可确保客户端连接到正确的服务器。我只是使用类工厂CLSID对进程ID进行异或。客户端也知道进程ID,因此可以进行相同的更改。
  • 应用程序应在具有Sleep()调用的循环中调用CoCreateInstance()以等待对象工厂出现。在至少60秒过去之前不要声明失败(这就是我)。
  • 应用程序和服务器都需要一个清单,其中包含每个代理/存根DLL的<file>元素和每个远程接口的<comInterfaceExternProxyStub>元素。

答案 1 :(得分:0)

亚历,

nobugz是对的,您可以访问运行对象表,从当前正在运行的Delphi自动化进程中创建COM对象的实例。

但是我发现了一个我无法解释的大问题。我只能通过这种方式通过变量调度方法访问对象。

基本上如果我的Active X exe没有注册,如果我尝试通过接口实例化对象,我会收到“Interface Not Supported”错误,例如:

WebUpdate:IAutomation;

WebUpdate:= CoAutomation.Create; &lt; - 不会工作错误


WebUpdate:Variant;

WebUpdate:= CreateOleObject('WebUpdate.Automation'); &lt; - 工作正常

如果我使用regserver注册活动x exe,问题就会消失!!

去图!