2010-06-02 162 views
4

我们正在尝试开发一种将消息发送到服务的应用程序,但我们只在两个应用程序之间发送消息。我们正在开发Delphi 7,Windows XP。如何发送消息给服务?

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

那么,有人说,从应用程序发送消息到服务是不可能的。因此,我们决定提供两项服务,现在我们必须将消息从一项服务发送到另一项服务。现在,重点是:如何从服务向另一个服务发送消息?

回答

13

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

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

+0

对不起,但它是错误的。您可以将窗口消息发送到服务。只需在创建服务时设置适当的参数。然后你创建你自己的消息处理程序。而在本地,使用WM_COPYDATA的GDI消息比任何其他IPC机制都快(至少如果你的消息是KB)。要将消息发送回应用程序,只需使用PostMessage或SendMessage呼叫到客户端HWND实例(已使用第一条消息发送)。请参阅http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas和TSQLRestClientURIMessage + TSQLRestServer.ExportServerMessage – 2011-02-20 09:35:27

+1

@ A.Bouchez:您指的是什么创建参数? 'SERVICE_INTERACTIVE_PROCESS'?从Vista开始,不再支持该标志。窗口消息不能通过会话边界(在任何Windows版本中)。服务可以与外部应用程序交换窗口消息的唯一方式是该应用程序与服务在同一个会话中运行。服务不要与XP和更早版本中的大多数登录用户以及Vista和更高版本中的NO用户在同一会话中运行。 – 2011-02-22 08:31:31

7

我建议命名管道。有人已经提供了great example in Delphi(这个网站上也有其他例子)

+0

用于引导到比你的另一个答案+1 ... :) – 2010-06-03 00:13:31

0

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

Richard