如何使用 Qt 启动/停止 Windows 服务?
Posted
技术标签:
【中文标题】如何使用 Qt 启动/停止 Windows 服务?【英文标题】:How to start/stop windows service using Qt? 【发布时间】:2017-09-29 08:17:27 【问题描述】:让我们想象一下情况:我正在运行名为“Test”的 Windows 服务。现在我想使用 Qt 应用stop 或 start(如果已停止)此服务。
我该怎么做?
注意:
我不想调用 cmd 并使用“net start”和“net stop”命令!
【问题讨论】:
有了这样的限制,Windows API 是唯一的方法,AFAIK:msdn.microsoft.com/en-us/library/ms682108(v=vs.85).aspx 为什么你认为应该用Qt来完成?为什么不用 WinAPI? 【参考方案1】:你可以使用相应的Qt解决方案https://github.com/qtproject/qt-solutions/tree/master/qtservice
然后你可以这样做:
QtServiceController controller("Test");
controller.stop();
controller.start();
【讨论】:
这是一个创建您自己的服务的解决方案。但是@j-doe 正在询问如何控制现有的。 不,它也是用来控制服务的。QtServiceController
类用于控制服务,而QtService
用于创建服务。它只是同一个库的两个部分。
这些服务可以在QT安装框架(ControlScript.qs)中使用吗?我想在从 QT 安装程序卸载时停止 windows 服务【参考方案2】:
很遗憾,Qt 没有在 API 上提供这种类型。
您需要研究 WinAPI 解决方案。 有an example on MSDN如何停止服务。我相信你能想出如何使用相同的方法来启动它。
此外,您还可以查看much smaller example 如何启动和停止服务。
【讨论】:
【参考方案3】:您可以只使用sc
命令(this page 有一些使用信息,或者只需在命令提示符下输入sc
)。
sc stop Test
sc start Test
所以:
QProcess::execute("sc", "stop", "Test" );
QProcess::execute("sc", "start", "Test" );
请注意,您需要在提升的上下文中运行才能控制大多数服务。
如果您愿意,也可以使用 net
代替 sc
,启动和停止的语法相同。
参数需要是服务键名,不是显示名;因此,如果您只有显示名称,则可以运行 sc query
或 sc GetKeyName "Display Name"
并解析输出。
【讨论】:
以上是关于如何使用 Qt 启动/停止 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 启动/停止远程服务器上的服务 - Windows 2008 并提示输入凭据?