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

时间:2009-05-25 13:46:51

标签: delphi delphi-2009 interprocess

我需要一些相关的应用程序来相互通信(交换数据并启动操作)。要求没有包,也没有套接字。所以我想这就是命名管道,WM_CopyData(就像Skype那样)和命令参数。你最好的做法是什么?

8 个答案:

答案 0 :(得分:5)

你可能有几个选择。

超越你已有的:
DDE
内存映射文件(MMF)
邮筒

我可能会选择Pipes或MMF。

您可以下载几个免费的MMF组件, Deborah Pate有一套你可以使用的免费软件。 MapFiles.zip

检查Torry's网站上的MailSlots。

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

答案 1 :(得分:4)

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

自Delphi 7(或更早版本,我不确定)以来,可以通过向项目和Automation对象添加类型库来轻松完成。

它的优势得到了广泛的支持,在Delphi中都是如此(类型库编辑器拥有您需要的所有内容并更新代码,COM内部和注册都来自ComServ单元),以及Delphi之外(我使用它)一些与各种应用程序交互的项目:C ++项目,使用VBA的Word和Excel文档,oldskool ASP ......)。

我遇到的唯一缺点可能是线程问题,在正常的应用程序中,应用程序启动时会出现普通CoInitialize(nil);,在更复杂的应用程序中,您需要考虑“线程公寓”或使用免费线程并执行你自己锁定。 (在某些情况下,你已经做过了。)

答案 2 :(得分:2)

另一种易于实现的方法是使用数据库传递信息。

并不过分优雅,它确实使用了大量开销,但如果您的应用程序已经具有数据感知功能(即将数据库作为其中的一部分),则使用一两个表来传递信息非常简单。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

我对命名管道的另一次投票,用于数据交换。我喜欢它们比mmap文件略多,因为win32管道API为您提供了一些不错的选择:sync / async,字节流与消息包,简单的ReadFile / WriteFile调用。所有这些你可以用mmaps自己做...但管道已经存在......

您可以使用安全属性控制访问 - 这不是WM_CopyData的选项。这可能不会立即出现问题...但即使您不关心谁发送您的应用消息,也可以方便地选择。对我来说,当Vista出现时,这很有用,突然用户应用程序在一个单独的会话中运行到我的服务。很好的调整安全属性是让事情再次运作所需的唯一事情。

对于“启动操作”,您可以使用像某些命名事件一样简单的东西,而不用担心发送消息?感兴趣的各方只是等待它发出信号。

就个人而言,除非你必须专门支持基于COM的客户,否则我会避免使用COM。

答案 5 :(得分:0)

不要使用COM,过多的开销(变种),你必须注册.dll或.exe(它会带来很多奇怪的安装+更新问题)。

我应该选择MMF,我用它来与Windows服务进行通信。 我使用以下TGpMessageQueueReader和writer: http://17slon.com/gp/gp/gpsync.htm

答案 6 :(得分:0)

如果你想传递数据,调用函数等然后使用COM,但是如果有很多调用,请注意COM很慢。此外,您可能必须在“xxx.exe / Regserver”之前注册该应用程序,然后才能运行。

答案 7 :(得分:-1)

这不是RemObjects擅长的那种吗? BRI