Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将接口传递给其他进程_Delphi_Com_Interface_Ipc_Idispatch - Fatal编程技术网

Delphi 将接口传递给其他进程

Delphi 将接口传递给其他进程,delphi,com,interface,ipc,idispatch,Delphi,Com,Interface,Ipc,Idispatch,我使用WM_COPYDATA来实现我的两个进程A和B之间的通信。使用基本数据类型交换数据没有问题 现在我遇到了一个问题,在某些情况下,我希望将接口(IDispatch)从进程a传递到进程B。是否可能?不可能直接将接口指针传递到另一个进程。与任何其他指针一样,接口仅在运行时实例化它的进程地址空间中有效。COM有自己的机制跨进程边界封送接口和数据,甚至跨同一进程中的不同单元。在接口的情况下,涉及在每个进程/单元中运行并使用各种IPC机制(如管道、RPC或TCP/IP)相互通信的代理和存根。看看这些文

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


现在我遇到了一个问题,在某些情况下,我希望将接口(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
),因此我认为它可能会有所帮助。。。