将接口传递给其他进程

时间:2012-04-08 05:03:51

标签: delphi com interface ipc idispatch

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

现在我遇到了一个问题,在某些情况下我想将一个接口(IDispatch)从我的进程A传递给我的进程B.是否可能?

2 个答案:

答案 0 :(得分:12)

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

Inter-Object Communication

Understanding Custom Marshaling Part 1

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

答案 1 :(得分:8)

它无法直接完成,但您可以使用客户端 - 服务器服务框架,该框架可能是基于接口的。

例如,请参阅我们的开源 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层商业软件包(如http://www.remobjects.com/da)公开您的界面。这类似于mORMot中实现的方法。

COM也是一个很好的候选者,原生于Windows,但初始化起来比较困难:你必须在每台PC上注册COM(具有管理员权限),你将无法使其工作通过网络(不推荐使用DCOM,请记住)。如果您希望将您的服务与其他语言(如.Net)共享,但仅在本地共享,则COM很好。

相关问题