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