我们调整我们的客户端相对较复杂的应用程序(件/.net/Delphi/C++/COM)使用智能实现无管理的部署和脱离的旧版本的我们的产品。

我们能够实现这一目标几乎所有我们在proc类的组件作为我们的。净ui、德尔福ui,COM服务器,我们使用在proc通过撰写的清单的文件,该文件所描述的所有图书馆使用过我们的过程中,没有注册在客户的任何组件(几乎).

这里涉及的几乎一部分:此刻,我们应援引(从这c++部分)的proc件服务器(Delphi件EXE),其中把自己援引另一组的proc件服务器(第三者的插件,任何的东西放在这里德尔福、C++、任何事情,只要是出的proc件EXE和实现我们的接口).

因为我们知道 智能不支持推proc件服务器。我们不能使用这些对象,如在proc com服务器在我们的主要进程,因为这将需要一个主要重写我们的应用甚至最坏的情况,突破我们的面向公众的API其使用由第三方的工具和供应商,api打破,我们不能允许。

我们迷迷糊糊的 这篇文章 它描述了如何IHTMLDocument2可以从中提取一个互联网浏览器窗口运行一个单独的进程。这使我们想到的这种方法:

我们将创建一个二级卫星的应用程序/流程,这将运行该件作为在处理服务器。然后我们将使用 LresultFromObjectObjectFromLresult 传输的参考件的对象卫星应用的主要应用程序的过程。该卫星的应用程序将有它自己的清单文件,这将能让它运行在智能模式。

同样的办法会可取之间通信这Delphi件EXE和第三方AciveX EXE插件

有一个替代解决方案,这对于我们不喜欢过拟议的解决办法上是使用。网远程处理。净com代理课程打开通信频道之间的两个过程,通过翻译com请求。网远程处理和回com在第二个过程。

因此,这里涉及的问题:

  1. 你怎么想到这个方法?
  2. 你看到一个更好的解决问题?
有帮助吗?

解决方案

这是可以做到的。什么是必要的:

  • 应用程序需要启动一个服务器本身,而不是依赖于COM做到这一点。你不需要额外的间接提供的注册,只是使用CreateProcess().
  • 一个服务器应该登记册的类工厂,在其主要()方法与CoRegisterClassObject().
  • 重要的是:CLSID它使用为每个工厂应改为唯一的为每个服务实例。这将确保客户连接到正确的服务器。我只是异或程ID与一个类工厂CLSID。客户知道的过程ID以及因此可以做出同样的改变。
  • 该应用程序应该叫CoCreateInstance()中的一个环Sleep()呼叫等待对象的工厂出现。不宣布失效,直到至少60秒过去了(这位我)。
  • 这两个应用程序和服务器需要一个清单包含一个 <file> 元,用于每个代理/stub DLL <comInterfaceExternProxyStub> 元素,为每个接口,这是远程.

其他提示

亚历,

nobugz是正确的,你可以访问运行对象表从你的Delphi自动化exe文件的当前运行的过程中创建一个COM对象的实例。

不过,我发现了一个大问题,我无法解释。以这种方式工作时,我可以仅经由所述变体调度方法访问该对象。

基本上,如果我的Active X exe文件没有注册,我得到一个“接口不支持”的错误,如果我通过接口尝试实例的对象,例如:

WebUpdate:IAutomation;

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


WebUpdate:变体;

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

如果我使用REGSERVER问题消失!!注册的Active X EXE

转到图!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top