QtService: Запустите установленную службу на Windows10 - PullRequest
0 голосов
/ 10 января 2020

Я создал простое сервисное приложение для тестирования с помощью QtService. Это можно легко выполнить в QtCreator с помощью аргументов командной строки: -exe c: это позволяет мне отлаживать сервис в QtCreator -install: это позволяет установить сервис (в качестве альтернативы, я также могу установить сервис через cmd с помощью команды s c).

После установки службы я пытаюсь запустить ее в управлении службами Windows. Тем не менее появляется сообщение об ошибке: «MyService» на «Локальный компьютер» не может быть запущен. Ошибка 1053: служба не ответила на запрос запуска или управления вовремя.

Это сообщение об ошибке появляется немедленно, без попытки запустить службу в течение 30 секунд. Я пробовал режим отладки и выпуска.

Я предполагаю, что DLL-библиотеки Qt также должны находиться рядом с 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);
}

основной. cpp

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

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

1 Ответ

0 голосов
/ 10 января 2020

Я нашел решение:

  1. В компиляторе Qt 5.13.1 (MinGW 7.3.0 64-bit) (в моем случае) измените каталог на exe-файл. Затем введите следующую команду: windeployqt.exe .

  2. Поместите QtSolutions_service-head.dll рядом с файлом exe.

Теперь я могу запустить службу .

...