【发布时间】:2011-01-10 16:02:13
【问题描述】:
我们有一个 Windows 服务正在运行,我们还有一个控制台应用程序用于配置此服务,我们还可以选择查看正在记录的一些日志。
这个非常丑陋的事情是这种通信是由一个文本文件进行的,控制台应用程序写入一个文本文件,服务读取它,反之亦然。
你会用什么来进行这种交流? TCP/IP 不是一个选项,因为控制台应用程序将仅用于本地运行的服务。
Windows API SendMessage 应该是要走的路吗?
谢谢!
【问题讨论】:
我们有一个 Windows 服务正在运行,我们还有一个控制台应用程序用于配置此服务,我们还可以选择查看正在记录的一些日志。
这个非常丑陋的事情是这种通信是由一个文本文件进行的,控制台应用程序写入一个文本文件,服务读取它,反之亦然。
你会用什么来进行这种交流? TCP/IP 不是一个选项,因为控制台应用程序将仅用于本地运行的服务。
Windows API SendMessage 应该是要走的路吗?
谢谢!
【问题讨论】:
如果使用 .net 作为其为此类事物构建的并且相对易于使用,我会推荐 WCF 作为 Windows 上所有通信的首要考虑因素。由于您排除 TCP,我建议使用 Named Pipes Binding。
还有许多 Windows 通信 API 可用于机器内通信。 Named Pipes(如前所述)、MailSlots、Shared Memory (Memory Mapped files) 等
我的建议是将命名管道与 WCF 或本机一起使用。
【讨论】:
共享内存?有关 Codeproject 的文章,请参阅 here,这是同一站点上的另一篇 fastipc 文章。有一篇博文详细介绍了如何使用 memory mapped file 通过包装器进行共享。
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
如果使用非阻塞的消息传递方法,死锁的风险就会降低。 PostMessage 或 SendNotifyMessage 比 SendMessage 更好,因为它们不会阻止调用者。
但它们依赖于具有窗口句柄的服务。是吗?
您还可以使用WM_COPYDATA 消息来传递不仅仅是wParam 和lParam。如果将此消息与 PostMessage 一起使用,则需要注意在接收者完成之前不要释放内存。对 WM_COPYDATA 使用 SendMessage 是最安全的。
【讨论】:
PostMessage 方法在 Vista 和稍后在某些情况下由于会话 0 隔离而失败 - 参见例如blogs.technet.com/askperf/archive/2007/04/27/…