QtService:在 Windows10 上启动已安装的服务
QtService: Start installed Service on Windows10
我创建了一个简单的服务应用程序,用于使用 QtService 进行测试。这可以使用命令行参数在 QtCreator 中轻松执行:
-exec:这允许我在 QtCreator 中调试服务
-install:这允许安装服务(或者,我也可以使用 sc 命令通过 cmd 安装服务)。
安装服务后,我尝试在Windows服务管理中启动它。但是,出现错误消息: "Local computer" 上的服务 "MyService" 无法启动。错误 1053: 服务没有及时响应启动或控制请求。
此错误消息在 30 秒内没有尝试启动服务时立即出现。我尝试了调试和发布模式。
我的猜测是 Qt dll 也必须在 EXE 旁边。但是我不知道是哪个。
simpleService.pro
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
myservice.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
include(qtservice/src/qtservice.pri)
HEADERS += \
myservice.h
myservice.h
#ifndef MYSERVICE_H
#define MYSERVICE_H
#include <qtservice.h>
#include <QCoreApplication>
#include <QDebug>
#include <QObject>
class MyService: public QtService<QCoreApplication>
{
public:
MyService(int argc, char **argv);
~MyService();
protected:
void start();
void pause();
void resume();
void stop();
void createApplication(int &argc, char **argv);
private:
QStringList _args;
};
#endif // MYSERVICE_H
myservice.cpp
#include "myservice.h"
MyService::MyService(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, "MyService7")
{
try {
qDebug() << "CONSTRUCTOR";
setServiceDescription("This is my service. ");
setServiceFlags(QtServiceBase::CanBeSuspended); // able to resume
qDebug() << "CONSTRUCTOR 1";
} catch (...) {
qCritical() << "An unknown error occured in constructor";
}
}
MyService::~MyService()
{
qDebug() << "DECONSTRUCTOR";
}
void MyService::start()
{
qDebug() << "START";
try {
QCoreApplication *app = application(); // nessesary for windows
qDebug() << "Service started";
qDebug() << app->applicationDirPath();
} catch (...) {
qCritical() << "An unknown error occured in start";
}
}
void MyService::pause()
{
qDebug() << "PAUSE";
}
void MyService::resume()
{
qDebug() << "RESUME";
}
void MyService::stop()
{
qDebug() << "STOP";
}
void MyService::createApplication(int &argc, char **argv)
{
for (int i = 0; i < argc; i++)
{
_args.append(QString(argv[i]));
qDebug() << "Arg: " << argv[i];
}
QtService::createApplication(argc, argv);
}
main.cpp
#include "myservice.h"
#include <QCoreApplication>
int main(int argc, char *argv[])
{
MyService service(argc, argv);
return service.exec();
}
我找到了解决方案:
在 Qt 5.13.1(MinGW 7.3.0 64 位)编译器(在我的例子中)将目录更改为 exe 文件。然后输入以下命令:windeployqt.exe .
将QtSolutions_service-head.dll放在exe文件旁边。
现在我可以启动服务了。
在win10上,如果你想让它作为服务工作,你应该在powershell中以管理员模式安装它,否则将无法工作!
我创建了一个简单的服务应用程序,用于使用 QtService 进行测试。这可以使用命令行参数在 QtCreator 中轻松执行: -exec:这允许我在 QtCreator 中调试服务 -install:这允许安装服务(或者,我也可以使用 sc 命令通过 cmd 安装服务)。
安装服务后,我尝试在Windows服务管理中启动它。但是,出现错误消息: "Local computer" 上的服务 "MyService" 无法启动。错误 1053: 服务没有及时响应启动或控制请求。
此错误消息在 30 秒内没有尝试启动服务时立即出现。我尝试了调试和发布模式。
我的猜测是 Qt dll 也必须在 EXE 旁边。但是我不知道是哪个。
simpleService.pro
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
myservice.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
include(qtservice/src/qtservice.pri)
HEADERS += \
myservice.h
myservice.h
#ifndef MYSERVICE_H
#define MYSERVICE_H
#include <qtservice.h>
#include <QCoreApplication>
#include <QDebug>
#include <QObject>
class MyService: public QtService<QCoreApplication>
{
public:
MyService(int argc, char **argv);
~MyService();
protected:
void start();
void pause();
void resume();
void stop();
void createApplication(int &argc, char **argv);
private:
QStringList _args;
};
#endif // MYSERVICE_H
myservice.cpp
#include "myservice.h"
MyService::MyService(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, "MyService7")
{
try {
qDebug() << "CONSTRUCTOR";
setServiceDescription("This is my service. ");
setServiceFlags(QtServiceBase::CanBeSuspended); // able to resume
qDebug() << "CONSTRUCTOR 1";
} catch (...) {
qCritical() << "An unknown error occured in constructor";
}
}
MyService::~MyService()
{
qDebug() << "DECONSTRUCTOR";
}
void MyService::start()
{
qDebug() << "START";
try {
QCoreApplication *app = application(); // nessesary for windows
qDebug() << "Service started";
qDebug() << app->applicationDirPath();
} catch (...) {
qCritical() << "An unknown error occured in start";
}
}
void MyService::pause()
{
qDebug() << "PAUSE";
}
void MyService::resume()
{
qDebug() << "RESUME";
}
void MyService::stop()
{
qDebug() << "STOP";
}
void MyService::createApplication(int &argc, char **argv)
{
for (int i = 0; i < argc; i++)
{
_args.append(QString(argv[i]));
qDebug() << "Arg: " << argv[i];
}
QtService::createApplication(argc, argv);
}
main.cpp
#include "myservice.h"
#include <QCoreApplication>
int main(int argc, char *argv[])
{
MyService service(argc, argv);
return service.exec();
}
我找到了解决方案:
在 Qt 5.13.1(MinGW 7.3.0 64 位)编译器(在我的例子中)将目录更改为 exe 文件。然后输入以下命令:
windeployqt.exe .
将QtSolutions_service-head.dll放在exe文件旁边。
现在我可以启动服务了。
在win10上,如果你想让它作为服务工作,你应该在powershell中以管理员模式安装它,否则将无法工作!