如何从Windows服务主函数启动C ++本机应用程序(应用程序与控制台交互)?

时间:2015-08-19 16:58:30

标签: c++ windows-services

我使用_spawnl()函数从主服务函数(SvcMain)启动C ++本机应用程序,但应用程序永远不会运行。

是否有任何技巧可以启动与用户交互的应用程序?

1 个答案:

答案 0 :(得分:0)

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