【发布时间】:2015-08-19 16:58:30
【问题描述】:
我正在使用 _spawnl() 函数从主服务函数 (SvcMain) 启动 C++ 本机应用程序,但该应用程序永远无法运行。
启动与用户交互的应用程序有什么技巧吗?
【问题讨论】:
标签: c++ windows-services
我正在使用 _spawnl() 函数从主服务函数 (SvcMain) 启动 C++ 本机应用程序,但该应用程序永远无法运行。
启动与用户交互的应用程序有什么技巧吗?
【问题讨论】:
标签: c++ windows-services
它运行,你只是看不到它。您必须使用CreateProcessAsUser() 而不是_spawnl(),以便新进程在特定用户的会话中运行,而不是在服务自己的会话中运行。在 Vista 及更高版本中,服务在其自己的隔离会话(会话 0 隔离)中运行,用户无法看到或与之交互。一种常见的解决方案是使用WTSGetActiveConsoleSessionId() 和/或WTSEnumerateSessions() 来查找所需的用户会话,然后使用WTSQueryUserToken() 获取令牌,可以与CreateEnvironmentBlock() 和CreateProcessAsUser() 一起使用。此外,在将STARTUPINFO 提供给CreateProcessAsUser() 时,将lpDesktop 字段设置为"WinSta0\\default"(用户登录后可以与之交互的默认桌面)。
【讨论】:
CreateProcessAsUser() 可以做到这一点。
CreateProcessAsUser()。我知道它有效,我在自己的服务中使用它来启动交互式流程。