【问题标题】:Console app to communicate with a windows service与 Windows 服务通信的控制台应用程序
【发布时间】:2011-01-10 16:02:13
【问题描述】:

我们有一个 Windows 服务正在运行,我们还有一个控制台应用程序用于配置此服务,我们还可以选择查看正在记录的一些日志。

这个非常丑陋的事情是这种通信是由一个文本文件进行的,控制台应用程序写入一个文本文件,服务读取它,反之亦然。

你会用什么来进行这种交流? TCP/IP 不是一个选项,因为控制台应用程序将仅用于本地运行的服务。

Windows API SendMessage 应该是要走的路吗?

谢谢!

【问题讨论】:

    标签: windows ipc


    【解决方案1】:

    如果使用 .net 作为其为此类事物构建的并且相对易于使用,我会推荐 WCF 作为 Windows 上所有通信的首要考虑因素。由于您排除 TCP,我建议使用 Named Pipes Binding

    还有许多 Windows 通信 API 可用于机器内通信。 Named Pipes(如前所述)、MailSlotsShared Memory (Memory Mapped files)

    我的建议是将命名管道与 WCF 或本机一起使用。

    【讨论】:

      【解决方案2】:

      共享内存?有关 Codeproject 的文章,请参阅 here,这是同一站点上的另一篇 fastipc 文章。有一篇博文详细介绍了如何使用 memory mapped file 通过包装器进行共享。

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

        【解决方案3】:

        如果使用非阻塞的消息传递方法,死锁的风险就会降低。 PostMessageSendNotifyMessageSendMessage 更好,因为它们不会阻止调用者。

        但它们依赖于具有窗口句柄的服务。是吗?

        您还可以使用WM_COPYDATA 消息来传递不仅仅是wParam 和lParam。如果将此消息与 PostMessage 一起使用,则需要注意在接收者完成之前不要释放内存。对 WM_COPYDATA 使用 SendMessage 是最安全的。

        【讨论】:

        • +1 - 我不确定 OP 使用什么进行编码,但我过去曾使用 WM_COPYDATA PostMessage 进行进程之间的通信。如果内存分配正确,则为接收者设置它以在消息接收时释放它。这使它保持异步。
        • 请注意,PostMessage 方法在 Vista 和稍后在某些情况下由于会话 0 隔离而失败 - 参见例如blogs.technet.com/askperf/archive/2007/04/27/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        相关资源
        最近更新 更多