5

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

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

4

2 回答 2

12

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

对象间通信

了解自定义编组第 1 部分

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

于 2012-04-08T05:35:51.400 回答
8

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

例如,请参阅我们的开源mORMot 框架的最后一个功能:基于接口的服务示例代码此链接

您可以interface在远程进程上执行。该功能处理框架的所有通信方式,即进程内调用、GDI 消息、命名管道和 TCP/HTTP。在内部,它将WM_COPYDATA用于 GDI 消息,然后将参数和结果作为 JSON 传输。使用此链接下载源代码(使用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 是很好的选择。

于 2012-04-08T06:24:17.790 回答