Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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_Delphi 2009_Interprocess - Fatal编程技术网

在没有套接字的Delphi中进行应用程序数据交换的最佳方法是什么?

在没有套接字的Delphi中进行应用程序数据交换的最佳方法是什么?,delphi,delphi-2009,interprocess,Delphi,Delphi 2009,Interprocess,我需要一些相关的应用程序相互通信(交换数据和启动操作)。要求无包装,无插座。所以我猜这会留下命名管道、WM_CopyData(就像Skype那样)和命令参数。您的最佳做法是什么?您可能有两种选择 超出您已有的范围: DDE 内存映射文件(MMF) 邮箱 我可能会选择管道或MMF 有几个免费的MMF组件可以下载, Deborah Pate有一套免费软件类可供使用。 检查站点上的邮件槽 最终的解决方案可能取决于数据传输的数量、大小和频率,从而决定您选择哪个选项。我建议在这种情况下使用COM。(注意

我需要一些相关的应用程序相互通信(交换数据和启动操作)。要求无包装,无插座。所以我猜这会留下命名管道、WM_CopyData(就像Skype那样)和命令参数。您的最佳做法是什么?

您可能有两种选择

超出您已有的范围:
DDE
内存映射文件(MMF)
邮箱

我可能会选择管道或MMF

有几个免费的MMF组件可以下载, Deborah Pate有一套免费软件类可供使用。

检查站点上的邮件槽


最终的解决方案可能取决于数据传输的数量、大小和频率,从而决定您选择哪个选项。

我建议在这种情况下使用COM。(注意:不是COM+,不是ActiveX,不是OLE;COM,只是COM。)

由于Delphi7(或更早的版本,我不确定),通过向项目中添加类型库和自动化对象,可以很容易地实现这一点

它的优点是在Delphi内部(类型库编辑器提供您所需的一切并更新代码,COM内部和注册由ComServ单元提供)和Delphi外部都得到了广泛的支持(我在一些项目中使用它来与各种应用程序交互:C++项目、Word和Excel文档,使用VBA、OLSKOOL ASP……)。
我遇到的唯一缺点可能是线程问题,在普通应用程序中,在应用程序启动时使用普通的
CoInitialize(nil);
就可以了,在更复杂的应用程序中,您需要考虑“线程单元”或使用自由线程并执行自己的锁定(在某些情况下,您已经这样做了)

不要使用COM,这会带来太多开销(变体),而且必须注册.dll或.exe(这会带来很多奇怪的安装和更新问题)

我应该选择MMF,我使用它与Windows服务进行通信。 为此,我使用以下TGpMessageQueueReader和writer:

另一种非常简单的方法是使用数据库传递信息


不太优雅,而且会占用大量开销,但如果您的应用程序已经具有数据感知能力(即有一个数据库作为其一部分),然后使用一两个表来传递信息是非常容易的。

您可以使用简单的文件:一面写入,另一面读取。如果您需要双向通信,只需使用两个文件,每个方向一个


当然,这不是真正的高性能。

这不是RemObjects擅长的类型吗?
Bri

我对命名管道的另一次投票,是为了数据交换。我更喜欢它们,而不是mmap文件,因为win32管道API为您提供了一些现成的选择:同步/异步、字节流vs消息包、简单的ReadFile/WriteFile调用。所有这些您都可以使用mmap来完成……但管道已经存在了

你可以通过安全属性来控制访问——这不是WM_CopyData的选项。这可能不会立即成为问题……但是,即使你不在乎谁发送你的应用消息,也可以方便地使用该选项。对我来说,当Vista出现时,这很有帮助,突然用户应用程序在单独的会话中运行到我的服务。很好调整安全属性是使事情再次正常工作所需的唯一方法

对于“启动操作”,您可能可以轻松地处理一些命名事件,而不必担心发送消息?感兴趣的各方只需等待它发出信号


就个人而言,除非您必须特别支持基于COM的客户端,否则我会避免使用COM。

如果您想传递数据、调用函数等,请使用COM,但是如果有大量调用,请注意COM速度很慢。此外,您可能必须向“xxx.exe/Regserver”注册应用程序如果我选择命名管道或WM_CopyData,那么我将使用ReObject SDK,所以请不要回答。谢谢。你不是在寻找设计模式,而是在寻找技术。你是对的。我在考虑设计模式,但我的问题只是集中在技术上。设计模式将包括已准备好选择的技术及其实现。感谢您更正此问题。有些技术在终端服务器客户端中不起作用-例如,命名管道将不起作用,因为它们是每个系统而不是每个会话。请注意,CoInitialize()和ConInitialize()需要在每个使用COM的线程中调用。就像要提到的那样,自Delphi 3以来,COM对象的简单创建就已经可用。我认为这是一个优势:对于普通的自动化对象,ComServ句柄为您注册,如果您想使用TAutoObjectFactory的派生对象,您可以添加到UpdateRegistry m中方法。(我编辑了我的答案来提到这一点)此外,我还使用了本机类型,如BSTR(它很好地映射到代码中的WideString)和数值,它们执行得很好,并且在变量方面没有任何问题。(我从来没有在OleVariant方面遇到过任何问题,你在说什么?)+1通过文件进行通信有时会非常方便。这是一种在不同操作系统之间进行通信的简单方法,每种编程/脚本语言都支持它,并且它是为数不多的在读者死亡时信息不会丢失的方法之一。在文件中写入日期+时间可以使其像队列或堆栈一样工作,而只要你不是每秒发送数百条信息,或者如果每微秒都有意义的话,它就工作得很好。