与 Win32 服务的进程间通信

Posted

技术标签:

【中文标题】与 Win32 服务的进程间通信【英文标题】:Interprocess communication with a Win32 service 【发布时间】:2011-08-02 21:38:35 【问题描述】:

ControlService API 允许向 Win32 服务发送控制代码。但是,如果我需要发送(和接收)多个控制代码怎么办?在用户模式 ​​GUI Win32 应用程序和 Win32 服务之间建立通信以交换任意数据的最佳方式是什么? (假设我可以编译服务和​​应用程序)。该方法应该适用于 Windows 2000 到 Windows 7,并且适用于管理员和标准用户。谢谢!

【问题讨论】:

最好的方法是最能解决您的特殊问题的方法。您可以使用 DCOM、SOAP Web 服务、套接字、命名管道或 ... 编辑:我应该更好地搜索一下:发布问题后,我发现以下文章很好地解释了这一切:codeproject.com/KB/vista-security/interaction-in-vista.aspx 【参考方案1】:

听起来好像您打算让服务响应远程请求。为此,您可以使用命名管道,如前所述。然而,命名管道比 TCP 套接字要复杂一些。

如果您从事 TCP 套接字编程(socket()bind()listen() 等),您将能够将这些知识移植到其他平台。

【讨论】:

一个诚实的问题。为什么命名管道比套接字更复杂?我想了解更多。 匿名用户对命名管道的访问在 Windows 7 时间范围内变为只读:blogs.technet.com/b/nettracer/archive/2010/07/23/… 但是socket() 是永远的。 你认为这是一个严重的限制吗? 你在开玩笑吗?首先,我只发布了一个示例,说明为什么命名管道可能比套接字更“复杂”。 (注意,不是“复杂”,而是“复杂”——命名管道的概念很简单)在我给出的示例中,Microsoft 更改了命名管道的实现,使得以前工作的代码现在失败了。这会阻止我使用任何当前或未来的实现。另一方面,socket() API 没有任何允许未来重新定义行为的特定于 MS 的功能。 socket() 和朋友是事实上的标准。【参考方案2】:

您几乎可以使用任何 IPC 机制。如果您的服务和应用程序是基于 .net 的,那么最常见的解决方案是使用 WCF。对于原生代码服务和应用程序,一个非常常见的解决方案是命名管道。但最佳选择取决于您的具体使用需求。

【讨论】:

服务会话隔离呢?命名管道是否允许跨会话进行通信? @Andrei 是的,没问题。命名管道需要正确保护,但跨会话没有限制。 好的,谢谢,我会试试命名管道,看看效果如何。如果效果好,我会接受你的回答:-) 当我这样做时,我使用以下 DACL 来保护管道:D:(A;OICI;GRGW;;;AU)。这允许对经过身份验证的用户 (AU) 进行读/写访问。我用ConvertStringSecurityDescriptorToSecurityDescriptor() 做了一个安全描述符。 连接到命名管道的经过身份验证的用户 (AU) 是否使用客户端访问许可证 (CAL),如果它是通过该 AD 用户帐户与服务器进行身份验证的第一个连接?这些是 5 美元一个吗?

以上是关于与 Win32 服务的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Win32 进程间通信的分析与比较(13种方法)

Win32 共享内存的包装类? (进程间通信)

Win32 进程间通信分配

Windows进程间共享内存通信实例

Windows进程间通信

谈谈Mac进程间通信--XPC