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

Vic*_*Vic 5 delphi windows-services ipc delphi-2009 windows-vista

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

Dav*_*man 6

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

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

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


jpf*_*ius 5

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

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

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

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;
Run Code Online (Sandbox Code Playgroud)

只需实现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;
Run Code Online (Sandbox Code Playgroud)

IIRC只允许服务具有图形用户界面或具有网络访问权限,因此如果您的服务需要GUI(这应该避免,请参阅此问题),这可能是一个问题.我不知道Windwos Vista及其后来如何处理这个问题.