服务中的 DDE 客户端与用户会话中的服务器通信

DDE Client in Service talking to a server in user session

本文关键字:会话 服务器 通信 用户 客户端 DDE 服务      更新时间:2023-10-16

我编写了一个与第三方 DDE 服务器通信的 C++ DDE 客户端(控制台)应用程序。当我的客户端和服务器处于同一会话中时,这工作正常。然后,我将客户端代码移动到作为系统运行的 win32 服务中。尽管尝试了以下操作,但客户端代码仍无法获取服务器列表:1. 我尝试在 Win7 上启用"允许服务与桌面交互"。2.我在尝试与服务器通信的线程中模拟了用户。3 我尝试将客户端代码作为系统执行。

我可以理解主要问题是跨多个会话的通信。但是有什么方法可以优雅地实现吗?

从 Vista 开始,由于会话 0 隔离,"交互式"服务不再工作。

DDE 是一种基于 User32 的技术(它在内部使用窗口消息),因此不能跨会话边界使用。

若要执行正在尝试的操作,必须创建一个单独的非服务应用,该应用在用户会话的上下文中运行,并根据需要使用 DDE,通过与会话无关的 IPC 机制(如命名管道、套接字或 COM 对象)与服务来回通信。 该服务可以使用WTSQueryUserToken()CreateProcessAsUser()在需要时在特定用户会话中运行应用。 或者,您可以将应用配置为在用户登录时自动运行。