代码之家  ›  专栏  ›  技术社区  ›  Alex Shnayder

并行模拟进程外ActiveX

  •  3
  • Alex Shnayder  · 技术社区  · 16 年前

    我们正在适应客户机相对复杂的应用程序(ActiveX/.NET/Delphi/C++/COM),使用SXS实现非管理部署和与我们产品的旧版本隔离。

    我们能够为几乎所有的进程内组件(如.net ui、Delphi ui和我们在进程中使用的COM服务器)实现这一目标,方法是编写一个清单文件,该文件描述了我们进程使用的所有库,而没有在客户端注册任何组件(几乎)。

    接下来是几乎所有的部分: 目前,我们的应用程序(从它的C++部分)调用了一个OPROActiveX服务器(Delphi ActiveX Exe),而它本身又调用另一组OPro ActiveX服务器(第三方插件,任何东西都在这里,Delphi,C++,只要它不在PROC ActiveX EXE中,实现我们的接口)。

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

    我们偶然发现 this article

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

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

    还有一种替代解决方案,目前我们不喜欢上面提出的解决方案,即使用.net远程处理和.net com代理类打开两个进程之间的通信通道,方法是将com请求转换为.net远程处理,然后在第二个进程上返回com。

    所以问题来了:

    1. 你认为这个问题有更好的解决办法吗?
    2 回复  |  直到 9 年前
        1
  •  4
  •   Hans Passant    16 年前

    这是可能的。所需:

    • 应用程序需要自己启动服务器,而不是依赖COM来启动。您不需要注册表提供的额外间接寻址,只需使用CreateProcess()。
    • 服务器应使用CoRegisterClassObject()在其main()方法中注册其类工厂。
    • 应用程序应该在循环中使用Sleep()调用调用CoCreateInstance(),以等待对象工厂出现。在至少60秒过去之前不要宣布失败(这对我来说太麻烦了)。
    • <file> 每个代理/存根DLL和 <comInterfaceExternProxyStub>
        2
  •  0
  •   user300378 user300378    16 年前

    亚历克斯,

    nobugz是对的,您可以访问Running Object表,从当前运行的Delphi automation exe进程创建COM对象的实例。

    然而,我发现了一个我无法解释的大问题。当以这种方式工作时,我只能通过variant dispatch方法访问对象。

    基本上,如果我的Active X exe未注册,如果我尝试通过接口实例对象,则会出现“接口不受支持”错误,例如:

    网络更新:信息自动化;

    WebUpdate:=协同自动化。创建<——惯用错误


    算了吧!

    推荐文章