【问题标题】:Pass an Interface to a different process将接口传递给不同的进程
【发布时间】:2012-04-21 01:51:41
【问题描述】:

我使用WM_COPYDATA来启用我的两个进程A和B之间的通信。用基本数据类型交换数据没有问题。

现在我有一个问题,在某些情况下我想将一个接口 (IDispatch) 从我的进程 A 传递给我的进程 B。这可能吗?

【问题讨论】:

  • 没有 WM_COPYDATA 的直接经验。但是你检查过这个 - codeproject.com/Articles/5307/…。 Joseph Newcomer 似乎也暗示这是可能的 - flounder.com/wm_copydata.htm(他通常对 Win32 的所有事情都是正确的)
  • @Gangadhar 这是一个非常好的链接。问题在于所有数据都必须序列化到 WM_COPYDATA 缓冲区中 - 您可以手动完成(如作者建议的那样),或依赖自动编组,如 COM 或 mORMot。
  • 也许我完全不在了,但是 ObjectFromLresultLresultFromObject 呢?
  • @kobik 接口只有在创建它的过程中才有意义,这就是问题所在
  • @DavidHeffernan,是的,但我知道上面的函数是用来抓取外部的IHTMLDocument2接口(对象必须实现IAccessible),所以我认为它可能会有所帮助...跨度>

标签: delphi com interface ipc idispatch


【解决方案1】:

不能直接将接口指针传递给另一个进程。与任何其他指针一样,接口仅在运行时实例化它的进程地址空间中有效。 COM 有自己的机制来跨进程边界编组接口和数据,甚至跨同一进程中的不同单元。在接口的情况下,这涉及代理和存根,它们在每个进程/单元中运行并使用各种 IPC 机制(例如管道、RPC 或 TCP/IP)相互通信。查看这些文章,了解如何实现跨进程/单元的接口:

Inter-Object Communication

Understanding Custom Marshaling Part 1

要执行您的要求,而不采用自定义编组,您必须使其中一个进程充当进程外 COM 服务器,然后另一个进程可以使用 CoCreateInstance() 或 @ 987654324@ 获取指向在其本地地址空间中工作的服务器对象的接口指针,并让 COM 为您处理封送细节。

【讨论】:

    【解决方案2】:

    不能直接做,但是可以使用Client-Server服务框架,可能是基于接口的。

    例如,查看我们的开源mORMot 框架的最后一个功能:Interface based services sample codethis link

    您可以在远程进程上执行interface。该功能处理框架的所有通信方式,即进程内调用、GDI 消息、命名管道和 TCP/HTTP。在内部,它将使用WM_COPYDATA 发送 GDI 消息,然后将参数和结果以 JSON 格式传输。使用this link 下载源代码(使用http://synopse.info/fossil 1.16+ 版本)和文档(有几页关于如何实现这些服务)。

    它是一个开源项目,支持 Delphi 6 到 XE2。

    您还可以使用 SOAP 或 DataSnap 客户端-服务器(如果您有相应版本的 Delphi)或 n-Tier 商业包(如http://www.remobjects.com/da)公开您的界面。这类似于mORMot中实现的方法。

    COM 也是一个不错的候选对象,它是 Windows 原生的,但它更难初始化:您必须在每台 PC 上注册 COM(具有管理员权限),并且无法使其工作通过网络(DCOM 已弃用,请记住)。如果您希望与其他语言(例如 .Net)共享您的服务,但只能在本地共享,COM 是很好的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2019-08-29
      • 2012-08-29
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多