我使用_spawnl()
函数从主服务函数(SvcMain
)启动C ++本机应用程序,但应用程序永远不会运行。
是否有任何技巧可以启动与用户交互的应用程序?
答案 0 :(得分:0)
它运行,你只是看不到它。您必须使用CreateProcessAsUser()
而不是_spawnl()
,以便新流程在特定用户的会话中运行,而不是在服务自己的会话中运行。在Vista及更高版本中,服务在他们自己的隔离会话(会话0隔离)中运行,用户无法查看或与之交互。一个常见的解决方案是使用WTSGetActiveConsoleSessionId()
和/或WTSEnumerateSessions()
来查找所需的用户会话,然后使用WTSQueryUserToken()
获取令牌hanlde可以与CreateEnvironmentBlock()
和{{一起使用1}}。此外,在向CreateProcessAsUser()
提供STARTUPINFO
时,请将CreateProcessAsUser()
字段设置为lpDesktop
(用户在登录后可以与之交互的默认桌面)。