【问题标题】:How can I launch a C++ native application from a Windows Service main function (the application interacts with the console)?如何从 Windows 服务主函数(应用程序与控制台交互)启动 C++ 本机应用程序?
【发布时间】:2015-08-19 16:58:30
【问题描述】:

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

启动与用户交互的应用程序有什么技巧吗?

【问题讨论】:

    标签: c++ windows-services


    【解决方案1】:

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

    【讨论】:

    • 谢谢。如果我只想启动应用程序(此应用程序需要在服务进程之外启动),并且我不希望服务与将要启动的应用程序交互。上述建议是否仍适用于我的情况?
    • 是的。您说您希望 用户 与应用程序交互,因此您必须在用户会话中运行它,CreateProcessAsUser() 可以做到这一点。
    • 我看不到我的应用程序在桌面上运行。请看我的代码。
    • 我无法粘贴代码(太大)。 CreateProcessAsUser() 函数成功,但应用程序没有在桌面上运行。
    • 请edit your question显示代码。不要试图在这里发表评论。您可能错误地使用了CreateProcessAsUser()。我知道它有效,我在自己的服务中使用它来启动交互式流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多