Delphi 将接口传递给其他进程
我使用WM_COPYDATA来实现我的两个进程A和B之间的通信。使用基本数据类型交换数据没有问题Delphi 将接口传递给其他进程,delphi,com,interface,ipc,idispatch,Delphi,Com,Interface,Ipc,Idispatch,我使用WM_COPYDATA来实现我的两个进程A和B之间的通信。使用基本数据类型交换数据没有问题 现在我遇到了一个问题,在某些情况下,我希望将接口(IDispatch)从进程a传递到进程B。是否可能?不可能直接将接口指针传递到另一个进程。与任何其他指针一样,接口仅在运行时实例化它的进程地址空间中有效。COM有自己的机制跨进程边界封送接口和数据,甚至跨同一进程中的不同单元。在接口的情况下,涉及在每个进程/单元中运行并使用各种IPC机制(如管道、RPC或TCP/IP)相互通信的代理和存根。看看这些文
现在我遇到了一个问题,在某些情况下,我希望将接口(IDispatch)从进程a传递到进程B。是否可能?不可能直接将接口指针传递到另一个进程。与任何其他指针一样,接口仅在运行时实例化它的进程地址空间中有效。COM有自己的机制跨进程边界封送接口和数据,甚至跨同一进程中的不同单元。在接口的情况下,涉及在每个进程/单元中运行并使用各种IPC机制(如管道、RPC或TCP/IP)相互通信的代理和存根。看看这些文章,了解如何跨流程/单元使用接口:
要执行您所要求的操作,而不必实现自定义封送,您必须使其中一个进程充当进程外COM服务器,然后另一个进程可以使用
CoCreateInstance()
或GetActiveObject()
获取指向在其本地地址空间内工作的服务器对象的接口指针,并让COM为您处理封送处理详细信息。这不能直接完成,但您可以使用基于接口的客户机-服务器服务框架
例如,请参阅我们的开源mORMot框架的最后一个特性:和
您可以在远程进程上执行接口
。该特性处理框架的所有通信方式,即进程内调用、GDI消息、命名管道和TCP/HTTP。在内部,它将对GDI消息使用WM_COPYDATA
,然后将参数和结果作为JSON传输。用于下载源代码(使用1.16+版本)和文档(有几页介绍如何实现这些服务)
这是一个开源项目,使用Delphi6到XE2
您还可以使用SOAP或DataSnap客户机服务器(如果您有相应版本的Delphi)或n层商业软件包(例如)公开您的接口。这与mORMot中实现的方法类似
COM也是一个很好的候选者,它是Windows本机的,但初始化起来比较困难:您必须在每台PC上注册COM(具有管理员权限),并且您将无法使其在网络上工作(请记住,DCOM已被弃用)。如果您希望您的服务与其他语言(如.Net)共享,但仅在本地共享,则COM很好。对WM_COPYDATA没有直接体验。但是你查过这个了吗。另外,Joseph Newcomer似乎认为这是可能的(他对Win32的所有事情都是正确的)@Gangadhar这是一个非常好的链接。问题来自这样一个事实,即所有数据都必须序列化到WM_COPYDATA缓冲区中—您可以手动(如作者所建议)或依靠自动封送,如COM或mORMot。也许我完全不喜欢,但关于和呢?@kobik接口只有在创建它的过程中才有意义,这就是问题所在problem@DavidHeffernan,是的,但我知道上面的函数用于获取外部
IHTMLDocument2
接口(对象必须实现IAccessible
),因此我认为它可能会有所帮助。。。