2009-08-11 27 views

回答

6

要走的路是named pipes,您可能需要查看不同Integrity levels之间的通信。

This article探索如何在Vista中做到这一点。虽然它是用C++编写的,但它只是基本的Windows API调用,因此它应该足够快地转换成Delphi。

如果你想寻找更多关于这个问题,这个通信称为进程间通信,但更好的搜索词是IPC。

+1

这绝对是真的吗?我做了几个Windows服务,既充当TCP服务器又充当TCP客户端。他们都像“本地系统”一样运行良好。我一直认为限制在网络资源(//机器/资源/ ...)上。 – 2009-08-11 20:10:33

+1

第一个断言完全是假的。我曾经写过的每一项Windows服务都是某种网络守护进程。唯一需要时髦权限的是需要能够显示UI的时间。 – 2009-08-11 22:08:02

+0

是的,我记得错了,不允许创建与外部资源的网络连接,或者您必须以NetworkService身份运行。我删除了第一个断言。但是,命名管道仍然是与服务进行通信的更好方式(在查找有关IPC的vista兼容性文章时遇到问题) – 2009-08-12 07:27:26

2

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

3

有在Exchange Data between two apps across PC on LAN看看答案是几乎同样的问题现在。通过TCP的本地通讯是标准的。正如我在我的回复中所说的那样,使用“远程过程调用”类型接口的解决方案运行良好。我使用RemObjects SDK来处理这类事情,如果您希望稍后再扩展,则可以轻松扩展以控制整个网络。

这些都允许您创建连接,对于大部分代码是“透明的”,而你只需要调用它通过线路发送数据并取回结果的接口。然后,您可以计划你平时怎么做的,忘记插座等

+1

服务不必具有特殊权限才能使用网络,即使它只在本地进行监听? – 2009-08-11 14:22:32

+0

@Rob,它取决于服务运行的帐号。 – Kevin 2009-08-11 19:26:23

+0

我没有使用RemObjects使用系统帐户或用户帐户的问题。该问题与独立于TCP/IP套接字访问的域用户权限相关。 – mj2008 2009-08-12 09:45:09

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,这可能是一个问题(你应该避免反正看到这个question)。我不知道这是如何处理Windwos Vista和稍后。

3

你必须改变从本地系统服务用户,以网络服务,然后该服务可以使用TCPIP罚款。我有几个使用TCPIP作为外部控制钩子的服务。只要确保您的服务端口是可配置的,以便您可以处理任何冲突。

我的一些控件接口基于从内部HTTP服务器提供的XML页面。这使我可以使用任何可以到达该机器端口的网页浏览器来远程检查服务的状态。使用HTTP优于其他方法的优点是,当您需要处理现有网络硬件时,它可以很好地工作。

如果你只打算在本地通信,然后命名管道,mail slots or a memory mapped file可能是最好的方法。

+0

您不需要使用NetworkService帐户只是为了使用TCP。对于LocalSystem和LocalService帐户,它也可以正常工作。 – 2009-08-20 01:03:07

1

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

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

约翰

相关问题