桌面应用程序如何在Vista/Windows2008/Windows7下与Windows服务进行通信?应用程序需要向服务发送小字符串并接收字符串响应。 (请提供示例代码)Delphi 2009:如何在Vista下的Windows服务和桌面应用程序之间进行通信?
回答
要走的路是named pipes,您可能需要查看不同Integrity levels之间的通信。
This article探索如何在Vista中做到这一点。虽然它是用C++编写的,但它只是基本的Windows API调用,因此它应该足够快地转换成Delphi。
如果你想寻找更多关于这个问题,这个通信称为进程间通信,但更好的搜索词是IPC。
这绝对是真的吗?我做了几个Windows服务,既充当TCP服务器又充当TCP客户端。他们都像“本地系统”一样运行良好。我一直认为限制在网络资源(//机器/资源/ ...)上。 – 2009-08-11 20:10:33
第一个断言完全是假的。我曾经写过的每一项Windows服务都是某种网络守护进程。唯一需要时髦权限的是需要能够显示UI的时间。 – 2009-08-11 22:08:02
是的,我记得错了,不允许创建与外部资源的网络连接,或者您必须以NetworkService身份运行。我删除了第一个断言。但是,命名管道仍然是与服务进行通信的更好方式(在查找有关IPC的vista兼容性文章时遇到问题) – 2009-08-12 07:27:26
我还没有尝试过,但我认为你可以使用命名管道。
有在Exchange Data between two apps across PC on LAN看看答案是几乎同样的问题现在。通过TCP的本地通讯是标准的。正如我在我的回复中所说的那样,使用“远程过程调用”类型接口的解决方案运行良好。我使用RemObjects SDK来处理这类事情,如果您希望稍后再扩展,则可以轻松扩展以控制整个网络。
这些都允许您创建连接,对于大部分代码是“透明的”,而你只需要调用它通过线路发送数据并取回结果的接口。然后,您可以计划你平时怎么做的,忘记插座等
的利用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,这可能是一个问题(你应该避免反正看到这个question)。我不知道这是如何处理Windwos Vista和稍后。
你必须改变从本地系统服务用户,以网络服务,然后该服务可以使用TCPIP罚款。我有几个使用TCPIP作为外部控制钩子的服务。只要确保您的服务端口是可配置的,以便您可以处理任何冲突。
我的一些控件接口基于从内部HTTP服务器提供的XML页面。这使我可以使用任何可以到达该机器端口的网页浏览器来远程检查服务的状态。使用HTTP优于其他方法的优点是,当您需要处理现有网络硬件时,它可以很好地工作。
如果你只打算在本地通信,然后命名管道,mail slots or a memory mapped file可能是最好的方法。
您不需要使用NetworkService帐户只是为了使用TCP。对于LocalSystem和LocalService帐户,它也可以正常工作。 – 2009-08-20 01:03:07
我在我的服务应用程序中使用了一个组件集,这个组件集带有称为Simple IPC的源代码的免费软件。
搜索torry.net。在与桌面应用程序通信时,它在我的所有服务应用程序中都运行良好。
约翰
- 1. 如何在Windows Vista Session 0和桌面之间进行通信?
- 2. Windows服务和桌面应用程序之间的通信
- 3. 如何在Windows应用程序和Silverlight之间进行通信?
- 4. 如何使用WCF在应用程序和Windows服务之间进行通信?
- 5. 如何在ASP.NET wep应用程序和Windows服务之间进行通信?
- 6. 如何在Windows和主应用程序之间进行通信?
- 7. 服务与网络/桌面应用程序之间的通信
- 8. 如何在Silverlight和桌面应用程序之间进行通信?
- 9. Android:如何与Windows桌面应用程序进行通信?
- 10. Windows Phone应用程序和桌面应用程序之间的通信方式
- 11. 桌面应用程序和Windows服务之间进行通信的最佳方式
- 12. Windows服务和网络服务之间的进程间通信
- 13. flex:在桌面应用程序中的ActionScript和JavaScript之间进行通信
- 14. 如何在桌面和WP7之间使用Wcf进行通信?
- 15. 在Windows服务和Exchange服务器之间进行通信
- 16. 如何在WCF服务和主机应用程序之间进行通信?
- 17. Windows服务与桌面应用程序之间的交互
- 18. 通过本地网络在.NET桌面应用程序之间进行通信
- 19. 桌面应用程序和服务应用程序之间的不同行为
- 20. 如何在python和mac应用程序之间进行通信?
- 21. 如何在iOS应用程序和php之间进行通信?
- 22. 如何从Asp.net应用程序与Windows服务进行通信
- 23. 桌面应用程序和web前端之间的通信
- 24. 桌面应用程序和浏览器之间的通信
- 25. 在模拟器上部署的WP 7应用程序和桌面应用程序之间进行通信
- 26. 如何在Windows服务之间进行通信
- 27. 如何在Windows窗体应用程序和网站之间进行通信?
- 28. 在Windows Vista 64位下使用命令行编译Delphi 2009
- 29. 桌面应用程序和Web应用程序之间的通信
- 30. 使用SignalR在asp.net应用程序和桌面应用程序之间进行双向通信
太神奇了!我问了几乎相同的问题,我也更谦虚,但我只是批评而不是答案...... ;-) – PSyLoCKe 2013-04-08 14:35:48