繁体   English   中英

QtService:在Windows10上启动已安装的服务

[英]QtService: Start installed Service on Windows10

我创建了一个简单的服务应用程序来使用 QtService 进行测试。 这可以在 QtCreator 中使用命令行 arguments 轻松执行: -exec:这允许我在 QtCreator 中调试服务 -install:这允许安装服务(或者,我也可以通过 cmd 使用 sc 安装服务命令)。

我安装好服务后,尝试在Windows服务管理中启动。 但是,出现错误消息:无法启动“本地计算机”上的服务“MyService”。 错误1053:服务没有及时响应启动或控制请求。

在 30 秒内没有尝试启动服务,此错误消息会立即出现。 我尝试了调试和发布模式。

我的猜测是 Qt dll 也必须在 EXE 旁边。 但我不知道是哪个。

简单服务.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

我的服务.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

我的服务.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);
}

主.cpp

#include "myservice.h"
#include <QCoreApplication>

int main(int argc, char *argv[])
{
    MyService service(argc, argv);
    return service.exec();
}

我找到了一个解决方案:

  1. 在 Qt 5.13.1(MinGW 7.3.0 64-bit) Compiler(在我的情况下)将目录更改为 exe 文件。 然后输入以下命令: windeployqt.exe .

  2. 将 QtSolutions_service-head.dll 放在 exe 文件旁边。

现在我可以启动服务了。

在win10上,如果你想让它作为服务工作,你应该在powershell以管理员模式安装它,否则将无法使用! 屏幕截图在管理模式下运行良好screenshort 在正常模式下不能正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM