Delphi 2009:Vista下如何在Windows服务和桌面应用程序之间进行通信?

问题描述 投票:0回答:7

Vista/Windows2008/Windows7下桌面应用程序如何与Windows服务通信?应用程序需要向服务发送小字符串并接收返回的字符串响应。两者都是用Delphi 2009编写的。(请同时提供示例代码)

delphi windows-services windows-vista delphi-2009 ipc
7个回答
6
投票

要走的路是命名管道,您可能需要查看不同完整性级别之间的通信。

本文探讨了如何在 Vista 中执行此操作。虽然它是用 C++ 编写的,但它只是基本的 Windows API 调用,因此它应该足够快地转换为 Delphi。

如果您想搜索有关此主题的更多信息,这种通信称为进程间通信,但更好的搜索术语是 IPC。


5
投票

使用 Indy,您可以相对轻松地在应用程序之间创建 TCP 连接。特别是当您只需要发送字符串消息时。对于客户端(在您的情况下是桌面应用程序)来说,它基本上是

var
  Client : TIdTCPClient;
...
Client.Host := 'localhost';
Client.Port := AnyFreePortNumber;
Client.Connect;
Client.IOHandler.Writeln (SomeString);
Response := Client.Readln;
...
Client.Disconnect;

对于服务器(将是您的情况下的服务)

var
  Server  : TIdTCPServer;
  Binding : TIdSocketHandle;
...
Server.DefaultPort := SameFreePortNumberAsInClient;
Binding := Server.Bindings.Add;
Binding.IP := '127.0.0.1';    
Binding.Port := Server.DefaultPort;
Server.OnConnect := HandleConnection;
Server.OnDisconnect := HandleDisconnection;
Server.OnExecute := HandleCommunication;
Server.Active := True;

只需实现HandleCommunication方法即可。每当客户端决定发送某些内容时就会调用它。示例:

procedure MyClass.HandleCommunication (AContext : TIdContext);
var
  Request : String;
begin
  Request := AContext.Connection.IOHandler.Readln;
  if (Request = Command1) then
    HandleCommand1
  else if (Request = Command2) then
    HandleCommand2
  ...
end;

IIRC 服务只允许拥有图形用户界面或具有网络访问权限,因此如果您的服务需要 GUI,这可能会成为问题(无论如何您都应该避免这样做,请参阅此问题)。我不知道在 Windwos Vista 及更高版本中这是如何处理的。


3
投票

查看在 LAN 上跨 PC 的两个应用程序之间交换数据 中的答案,这与当今的问题几乎相同。通过 TCP 的本地通信是标准的。正如我在回复中所说,使用“远程过程调用”类型接口的解决方案效果很好。我使用 RemObjects SDK 来处理此类事情,如果您以后愿意的话,它可以轻松扩展以跨网络进行控制。

这两者都允许您创建一个对于大多数代码来说都是“透明”的连接,您只需调用一个接口即可通过线路发送数据并获取结果。然后您可以像平常一样进行编程,而忘记套接字等详细信息。


3
投票

您必须将服务用户从localsystem更改为networkservice,然后该服务才能正常使用TCPIP。 我有几个使用 TCPIP 作为外部控制挂钩的服务。 只需确保您的服务端口是可配置的,以便您可以处理任何冲突。

我的一些控制界面基于内部 HTTP 服务器提供的 XML 页面。 这使我能够使用任何可以到达该计算机上的端口的 Web 浏览器远程检查服务的状态。 与其他方法相比,使用 HTTP 的优点是,当您需要在现有网络硬件上工作时,它可以很好地工作。

如果您只想在本地进行通信,那么命名管道、邮件槽或内存映射文件可能是最好的方法。


2
投票

我还没有尝试过,但我认为你可以使用命名管道。


1
投票

我在我的服务应用程序中使用一个组件集,带有源代码的免费软件,称为 Simple IPC。

搜索 torry.net。当与桌面应用程序通信时,它在我的所有服务应用程序中都运行良好。

约翰


0
投票

我使用这个组件很多年了 Delphi 32 的 TMailslot 组件
版本:1.4
作者:阿列克谢·库兹涅佐夫

© www.soinside.com 2019 - 2024. All rights reserved.