将接口传递给另一个进程

5

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

现在我有一个问题,在某些情况下,我希望能够从进程A传递一个接口(IDispatch)到进程B中。这可能吗?


1
没有使用WM_COPYDATA的直接经验。但是你是否查看了这个链接 - http://www.codeproject.com/Articles/5307/Use-WM_COPYDATA-to-send-data-to-from-C-and-C-Windo。此外,Joseph Newcomer似乎暗示这是可能的 - http://www.flounder.com/wm_copydata.htm(他通常在Win32的所有事情上都是正确的)。 - Gangadhar
@Gangadhar 这是一个非常好的链接。问题在于所有数据都必须序列化到 WM_COPYDATA 缓冲区中 - 你可以手动完成(如作者建议的那样),或者依赖自动编组,例如 COM 或 mORMot。 - Arnaud Bouchez
1
也许我完全错了,但是ObjectFromLresultLresultFromObject怎么样? - kobik
@kobik 接口只有在创建它的过程中才有意义,这就是问题所在。 - David Heffernan
@DavidHeffernan,是的,但我知道上面的函数用于获取外部IHTMLDocument2接口(对象必须实现IAccessible),所以我想这可能会有帮助... - kobik
据我所知,这些函数是Active Accessibility COM接口使用的内部函数...与OP的问题无关。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd373592(v=vs.85).aspx。 - Arnaud Bouchez
2个回答

12

直接将接口指针传递到另一个进程是不可能的。与其他指针一样,接口只在运行时实例化它的进程地址空间中有效。COM拥有其自己的机制来在进程边界和甚至同一进程的不同公寓之间传输接口和数据。对于接口,这涉及在每个进程/公寓中运行的代理和存根,并使用各种IPC机制(例如管道、RPC或TCP/IP)相互通信。请查看以下文章了解如何在进程/公寓之间使用接口:

对象间通信

了解自定义封送处理第1部分

如果要避免实现自定义封送处理而做您所要求的事情,您需要使其中一个进程充当进程外COM服务器,然后另一个进程可以使用CoCreateInstance()GetActiveObject()来获取工作在其本地地址空间内的服务器对象的接口指针,并让COM为您处理封送处理的详细信息。


8
无法直接完成,但可以使用客户端-服务器服务框架,该框架可能是基于接口的。例如,请参见我们的开源mORMot框架的最后一个功能:基于接口的服务示例代码此链接。您可以在远程进程上执行一个接口。该功能处理框架的所有通信手段,即进程内调用、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,但它更难初始化:您需要在每台计算机上注册COM(具有管理员权限),而且无法在网络上运行(请记住,DCOM已弃用)。如果您希望将服务与其他语言共享,例如.Net,则COM是一个不错的选择,但仅限于本地。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接