我需要一些相关的应用程序来相互通信(交换数据和启动操作)。要求没有包,也没有插座。所以我猜这会留下命名管道、WM_CopyData(就像 Skype 那样)和命令参数。你的最佳实践是什么?
8 回答
我建议在这种情况下使用 COM。(注意:不是 COM+,不是 ActiveX,不是 OLE;COM,只是 COM。)
由于 Delphi 7(或更早的版本,我不确定),这很容易通过向项目添加类型库和自动化对象来完成。
优点是它得到了相当广泛的支持,无论是在 Delphi 内(类型库编辑器有你需要的一切并更新你的代码,COM 内部和注册都由 ComServ 单元提供),还是在 Delphi 之外(我在许多与各种应用程序交互的项目:C++ 项目、使用 VBA 的 Word 和 Excel 文档、oldskool ASP...)。
我遇到的唯一缺点可能是线程问题,在普通应用程序中,简单CoInitialize(nil);
的应用程序启动就可以了,在更复杂的应用程序中,您需要考虑“线程单元”或使用自由线程并进行自己的锁定。(在某些情况下,您已经这样做了。)
另一种实现起来很简单的替代方法是使用数据库来传递信息。
不是很优雅,而且确实使用了很多开销,但是如果您的应用程序已经是数据感知的(即,其中有一个数据库),那么使用一两个表来传递信息是相当容易的。
您可以使用简单的文件:一侧写入,另一侧读取。如果您需要双向通信,只需使用两个文件,每个方向一个。
当然,这并不是真正的高性能。
我对命名管道的另一票投给了数据交换。比起 mmap 文件,我更喜欢它们,因为 win32 管道 API 为您提供了一些开箱即用的不错选择:同步/异步、字节流与消息包、简单的 ReadFile/WriteFile 调用。所有这些你都可以用 mmaps 自己做......但是管道已经在那里......
您可以使用安全属性控制访问——这不是 WM_CopyData 的选项。这可能不会立即成为问题......但可以很方便地选择,即使您不在乎谁发送您的应用程序消息。对我来说,当 Vista 出现时,这很有帮助,突然间,用户应用程序在我的服务的单独会话中运行。很好的是,调整安全属性是让事情再次正常运行所需的唯一事情。
对于“启动操作”,您可能能够像一些命名事件一样简单地逃脱,而根本不用担心发送消息?相关方只是等待它发出信号。
就个人而言,除非您必须专门支持基于 COM 的客户端,否则我会避免使用 COM。
不要使用 COM,开销太大(变体),并且必须注册 .dll 或 .exe(它会带来很多奇怪的安装 + 更新问题)。
我应该选择 MMF,我用它来与 Windows 服务通信。我为此使用以下 TGpMessageQueueReader 和 writer:http: //17slon.com/gp/gp/gpsync.htm
如果您想传递数据、调用函数等,请使用 COM,但是如果有很多调用,请注意 COM 很慢。此外,您可能必须使用“xxx.exe /Regserver”注册应用程序,然后它才能工作。
这不是 RemObjects 擅长的那种吗?布里