如何使用 Qt 启动/停止 Windows 服务?

Posted

技术标签:

【中文标题】如何使用 Qt 启动/停止 Windows 服务?【英文标题】:How to start/stop windows service using Qt? 【发布时间】:2017-09-29 08:17:27 【问题描述】:

让我们想象一下情况:我正在运行名为“Test”的 Windows 服务。现在我想使用 Qt 应用stopstart(如果已停止)此服务。

我该怎么做?

注意:

我不想调用 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 querysc GetKeyName "Display Name" 并解析输出。

【讨论】:

以上是关于如何使用 Qt 启动/停止 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何从C#启动/停止Windows服务

如何使用 PowerShell 启动/停止远程服务器上的服务 - Windows 2008 并提示输入凭据?

如何在 C# mvc 中停止或启动 Windows 服务?

Windows 服务(托管 WCF 服务)在启动时立即停止

如何创建一个启动和停止多个'exe'/'bat的Windows服务

Windows 服务启动然后立即停止(代码问题?)