【问题标题】:How to send a message to a service?如何向服务发送消息?
【发布时间】:2010-06-02 19:27:36
【问题描述】:

我们正在尝试开发一个向服务发送消息的应用程序,但我们只有两个应用程序之间的发送消息。我们正在使用 Delphi 7、Windows XP 进行开发。

我们需要服务将消息发送回应用程序,具体取决于应用程序发送给服务的操作的结果。

好吧,有些人说不可能将消息从应用程序发送到服务。所以,我们决定做两个服务,现在我们必须将消息从一个服务发送到另一个服务。现在,重点是:如何将消息从一个服务发送到另一个服务?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    您不能将窗口消息发送到服务。一方面,服务没有自己的 UI,更不用说窗口了。其次,即使您将自己的隐藏窗口添加到服务中(实际上,基于 Delphi 的服务确实有隐藏的 TApplication 窗口),窗口消息也不允许越过会话边界(服务在不同于用户模式的单独会话中运行应用程序)。

    有许多 IPC(进程间通信)机制与服务一起工作 - 命名管道、邮槽、TCP/IP 和 UDP 套接字,仅举几例。您将不得不使用其中之一。

    【讨论】:

    • 对不起,这是假的。您可以将窗口消息发送到服务。只需在服务创建时设置适当的参数。然后你创建你自己的消息处理程序。在本地,带有 WM_COPYDATA 的 GDI 消息比任何其他 IPC 机制都快(至少如果您的消息是一些 KB)。要将消息发送回应用程序,您只需对客户端 HWND 实例(已与第一条消息一起发送)使用 PostMessage 或 SendMessage 调用。请参阅synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas 和 TSQLRestClientURIMessage + TSQLRestServer.ExportServerMessage
    • @A.Bouchez:您具体指的是什么创建参数? SERVICE_INTERACTIVE_PROCESS?从 Vista 开始不再支持该标志。窗口消息不能跨越会话边界(在任何版本的 Windows 中)。服务与外部应用程序交换窗口消息的唯一方法是该应用程序与服务在同一会话中运行。服务不会与 XP 和更早版本中的大多数登录用户在同一会话中运行,并且在 Vista 和更高版本中没有用户。
    【解决方案2】:

    我建议命名管道。 SO上的某人已经提供了great example in Delphi(此站点上还有其他示例)

    【讨论】:

      【解决方案3】:

      我将 Indy TCP 服务器与我的服务一起使用,然后我可以从同一台机器或其他机器进行通信。这是一个快速添加。我来回发送一条记录,记录的开头告诉服务器什么类型的消息以及缓冲区包含什么,反之亦然。

      理查德

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多