Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QtService:在Windows10上启动已安装的服务_C++_Qt_Windows Services - Fatal编程技术网

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

C++ QtService:在Windows10上启动已安装的服务,c++,qt,windows-services,C++,Qt,Windows Services,我创建了一个简单的服务应用程序,用于使用QtService进行测试。这可以使用命令行参数在QtCreator中轻松执行: -exec:这允许我在QtCreator中调试服务 -安装:这允许安装服务(或者,我也可以使用sc命令通过cmd安装服务) 安装服务后,我尝试在Windows服务管理中启动它。但是,出现错误消息:“本地计算机”上的服务“MyService”无法启动。错误1053:服务未及时响应启动或控制请求 此错误消息立即出现,但未尝试启动服务30秒。我尝试了调试和发布模式 我的猜测是Qt-

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

安装服务后,我尝试在Windows服务管理中启动它。但是,出现错误消息:“本地计算机”上的服务“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
\ifndef MYSERVICE\u H
#定义MYSERVICE\u H
#包括
#包括
#包括
#包括
类MyService:公共服务
{
公众:
MyService(int argc,char**argv);
~MyService();
受保护的:
void start();
无效暂停();
作废简历();
无效停止();
void createApplication(int&argc,char**argv);
私人:
QStringList_args;
};
#endif//MYSERVICE\u 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);
}
#包括“myservice.h”
MyService::MyService(intargc,char**argv):QtService(argc,argv,“MyService7”)
{
试一试{
qDebug()我找到了一个解决方案:

  • 在Qt 5.13.1(MinGW 7.3.0 64位)编译器(在我的例子中)中,将目录更改为exe文件。然后输入以下命令:
    windeployqt.exe。

  • 将QTU service-head.dll放在exe文件旁边

  • 现在我可以开始服务了

    #include "myservice.h"
    #include <QCoreApplication>
    
    int main(int argc, char *argv[])
    {
        MyService service(argc, argv);
        return service.exec();
    }