我们正在调整我们客户端相对复杂的应用程序(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。 然后,我们将使用LresultFromObject和ObjectFromLresult将ActiveX对象的引用从卫星应用程序传输到主应用程序进程。卫星应用程序将拥有自己的清单文件,允许它以SxS模式运行。
将采用相同的方法在此Delphi ActiveX EXE和第三方AciveX EXE插件之间进行通信
有一种替代解决方案,目前我们不喜欢上面提出的解决方案,即使用.net远程处理和.net com代理类来打开两个进程之间的通信通道,通过翻译com请求到.net远程处理,并回到第二个进程的com。
所以问题出现了:
答案 0 :(得分:4)
有可能做到。需要什么:
<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,问题就会消失!!
去图!