将qt程序注册成服务

将qt程序注册成服务

1、qt服务模块管理下载

qt-solutions

2、QtService项目

2.1、将qtservice拷贝到项目代码路径

在这里插入图片描述

2.2、实现服务管理

PS:响应服务的启停
CustomService.h

#include <QCoreApplication>
#include "qtservice.h"class CustomService : public QtService<QCoreApplication>
{
public:CustomService(int argc, char **argv);protected:void start();void pause();void resume();void stop();};
CustomService.cpp
#include "CustomService.h"
#include "ServiceHandle.h"CustomService::CustomService(int argc, char **argv): QtService<QCoreApplication>(argc, argv, "Custom Qt Server")
{setServiceDescription("Custom Qt Server");setServiceFlags(QtServiceBase::CanBeSuspended);
}void CustomService::start()
{QCoreApplication *app = application();SERVER_CTRL_INST.start();
}void CustomService::pause()
{SERVER_CTRL_INST.pause();
}void CustomService::resume()
{SERVER_CTRL_INST.resume();
}void CustomService::stop()
{SERVER_CTRL_INST.stop();
}

2.3、服务内部程序实现

ServiceHandle.h

#pragma once
#include "ThreadObject.h"#define SERVER_CTRL_INST ServiceHandle::Instance()
class ServiceHandle
{const std::string kProcessName = "QtService.exe";
public:static ServiceHandle& Instance(){static ServiceHandle g_inst;return g_inst;}protected:ServiceHandle();~ServiceHandle();public:void InstallService(const std::string& strServiceName = "");void StartService(const std::string& strServiceName);void StopService(const std::string& strServiceName);void UninstallService(const std::string& strServiceName);void start();void pause();void resume();void stop();private:void do_work();private:Utils::ThreadObject m_objWork;};

ServiceHandle.cpp

#include "ServiceHandle.h"
#include <fstream>
#include <QProcess>
#include <iostream>
#include <direct.h>
#include "Command.h"static int64_t g_nCnt =0;
ServiceHandle::ServiceHandle()
{
}ServiceHandle::~ServiceHandle()
{}void ServiceHandle::InstallService(const std::string& strServiceName/* = ""*/)
{char szPath[260] = { 0 };getcwd(szPath, 260);std::string strPath(szPath);strPath = strPath + "/" + kProcessName;std::cout << "Exe path: " << szPath << "\n";std::string strName = strServiceName.empty()? "CustomService": strServiceName;std::string strCmd = "sc create " + strName + " binpath=" + strPath;std::string strResponse = Utils::CommandHelper::ExecCommand(strCmd);std::cout << strResponse;// start serviceStartService(strName);
}void ServiceHandle::StartService(const std::string& strServiceName)
{std::string strCmd = "net start " + strServiceName;std::string strResponse = Utils::CommandHelper::ExecCommand(strCmd);std::cout << strResponse;
}void ServiceHandle::StopService(const std::string& strServiceName)
{std::string strCmd = "net stop " + strServiceName;std::string strResponse = Utils::CommandHelper::ExecCommand(strCmd);std::cout << strResponse;
}void ServiceHandle::UninstallService(const std::string& strServiceName)
{StopService(strServiceName);std::string strCmd = "sc delete " + strServiceName;std::string strResponse = Utils::CommandHelper::ExecCommand(strCmd);std::cout << strResponse;
}void ServiceHandle::start()
{g_nCnt = 0;m_objWork.Start(std::bind(&ServiceHandle::do_work, &SERVER_CTRL_INST), 2000);
}void ServiceHandle::pause()
{stop();
}void ServiceHandle::resume()
{start();
}void ServiceHandle::stop()
{m_objWork.Stop();
}void ServiceHandle::do_work()
{std::fstream fout("C:\\ProgramData\\CustomService.log", std::ios::out | std::ios::app);if(fout.is_open()) {fout << "Server do work: " << ++g_nCnt << "\n";fout.close();}
}

2.4、服务本身支持指令操作

PS:安装、卸载、启停以及常规启动(非服务)
main.cpp
#include <QApplication>
#include <iostream>
#include <string>
#include <map>
#include "CustomService.h"
#include "ServiceHandle.h"enum ServiceCmdType
{kServiceCmdTypeUnknown = -1,kServiceCmdTypeHelp,kServiceCmdTypeCommon,kServiceCmdTypeInstall,kServiceCmdTypeUninstall,kServiceCmdTypeStart,kServiceCmdTypeStop};std::map<std::string, ServiceCmdType> mapCmd
{{ "help", kServiceCmdTypeHelp },{ "common", kServiceCmdTypeCommon },{ "install", kServiceCmdTypeInstall },{ "uninstall", kServiceCmdTypeUninstall },{ "start", kServiceCmdTypeStart },{ "stop", kServiceCmdTypeStop }};void Usage()
{std::cout << "Usage: QtService [command] [option1] [option2]\n";std::cout << "command and options:\n";std::cout << "\tinstall [service name]:     install service, <service name> is optional, default is \"Custom Qt Server\" \n";std::cout << "\tstop [service name]:        stop service\n";std::cout << "\tstart [service name]:       start service\n";std::cout << "\tuninstall [service name]:   uninstall service\n";std::cout << "\tcommon:                     start process in common mode\n";std::cout << "\thelp:                       show usage\n";
}bool CheckValidCmd(const std::string& strCmd, ServiceCmdType& nCmd)
{bool bValid = false;auto itFind = mapCmd.find(strCmd);if(itFind != mapCmd.end()) {bValid = true;nCmd = itFind->second;}return bValid;
}// install/uninstall/start/stop service via inner action
int main(int argc, char *argv[])
{QApplication a(argc, argv);if(argc > 1) {int nIndex = 0;std::string strCmd = argv[++nIndex];ServiceCmdType nCmdType = kServiceCmdTypeUnknown;if(!CheckValidCmd(strCmd, nCmdType) || kServiceCmdTypeHelp == nCmdType) {Usage();return 0;}if(kServiceCmdTypeCommon == nCmdType) {SERVER_CTRL_INST.start();auto nCode = a.exec();SERVER_CTRL_INST.stop();return nCode;}if(argc < 3) {Usage();return 0;}std::string strServiceName = argv[++nIndex];switch(nCmdType) {case kServiceCmdTypeInstall: {SERVER_CTRL_INST.InstallService(strServiceName);break;}case kServiceCmdTypeUninstall: {SERVER_CTRL_INST.UninstallService(strServiceName);break;}case kServiceCmdTypeStart: {SERVER_CTRL_INST.StartService(strServiceName);break;}case kServiceCmdTypeStop: {SERVER_CTRL_INST.StopService(strServiceName);break;}default:break;}return 0;}// start exe with service(default)CustomService service(argc, argv);return service.exec();
}

PS:
1、qt.pro里增加CONFIG+=console,这样控制台有数据输出
2、unix下注册服务,修改对应注册服务命令即可
3、服务注册原理,外层一个壳子,响应服务操作,然后再执行对应逻辑
源代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290279.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【yolov8系列】 yolov8 目标检测的模型剪枝

前言 最近在实现yolov8的剪枝&#xff0c;所以有找相关的工作作为参考&#xff0c;用以完成该项工作。 先细读了 Torch-Pruning&#xff0c;个人简单记录了下 【剪枝】torch-pruning的基本使用&#xff0c;有框架完成的对网络所有结构都自适应剪枝是最佳的&#xff0c;但这里没…

【C语言】自定义类型之联合和枚举

目录 1. 前言2. 联合体2.1 联合体类型的声明2.2 联合体的特点2.3 相同成员的结构体和联合体对比2.4 联合体大小的计算2.4 判断当前机器的大小端 3. 枚举3.1 枚举类型的声明3.2 枚举类型的优点3.3 枚举类型的使用 1. 前言 在之前的博客中介绍了自定义类型中的结构体&#xff0c;…

加速度|SHOPFA商城如何与阿里云短信融合

商城系统上线之后&#xff0c;需要与短信平台进行融合&#xff0c;当客户下完订单之后&#xff0c;能够接收到支付短信、发货短信、配送短信等进度提示信息。阿里云短信&#xff0c;作为国内领先的短信平台&#xff0c;隶属于阿里云计算有限公司&#xff0c;背后强大的研发团队…

苏宁易购商品详情API:电商实时数据

一、引言 在当前的电商行业中&#xff0c;数据是最为宝贵的资源之一。如何获取实时、准确的数据&#xff0c;对于电商业务的运营和优化至关重要。作为中国领先的电商平台之一&#xff0c;苏宁易购提供了丰富的API接口&#xff0c;其中包括商品详情API&#xff0c;以便第三方开…

flutter开发实战-第一帧布局完成回调实现

flutter开发实战-第一帧布局完成回调实现 在开发中&#xff0c;我们有时候需要在第一帧布局完成后调用一些相关的方法。这里记录一下是实现过程。 Flutter中有多种不同的Binding&#xff0c;每种Binding都负责不同的功能。下面是Flutter中常见的Binding&#xff1a; 这里简单…

oracle vm virtualBox虚拟机网卡设置

一、桥接模式 1、桥接模式自动分配IP 通过dns自动分配Ip方式、重启服务器可能会出现IP变动的情况。 选中虚拟机--设置--网络&#xff0c;链接方式选择“桥接网卡”&#xff0c;界面名称选择“需要桥接的网卡名称” 不清楚的可以在宿主机网络设置查看&#xff08;需要桥接哪…

JVM调优小结

JVM常见工具介绍 jinfo(查看配置信息) 查看Java应用程序配置参数或者JVM系统属性&#xff0c;相关命令详情我们可以使用-help或者man命令查看&#xff0c;如下所示: [rootxxxxxtmp]# jinfo -help Usage:jinfo [option] <pid>(to connect to running process)jinfo [op…

一键在线获取APP公钥、包名、签名及备案信息方法介绍

​ 目录 一键在线获取APP公钥、包名、签名及备案信息方法介绍 摘要 引言 一键获取APP包信息 操作步骤 ​编辑 解析报告 总结 致谢 关键词 参考资料 声明 摘要 本文介绍了一款在线APP解析工具&#xff0c;可以一键获取APP的公钥、包名、签名等基础信息&#xff0c;…

3D材质编辑器

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 GLTF 编辑器 -NSDT 支持GLTF/GLB模型的基本材质的编辑修改&#xff0…

autostart 应用自启动配置

linux 通用配置 1. 编写 desktop 文件 # cat xxx.desktop [Desktop Entry] TypeApplication Exec/xxx/app //应用程序 2. 将 xxx.desktop 文件拷贝到 /etc/xdg/autostart/ 下面 # cp xxx.desktop /etc/xdg/autostart/

Linux Centos 配置 Docker 国内镜像加速

在使用 Docker 进行容器化部署时&#xff0c;由于国外的 Docker 镜像源速度较慢&#xff0c;我们可以配置 Docker 使用国内的镜像加速器&#xff0c;以提高下载和部署的效率。本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速。 步骤一&#xff1a;安装 Docker 首…

手机怎么设置每年公历或农历生日提醒?生日提醒设置小妙招

生日是一个人在一年中比较特殊的日子之一&#xff0c;人们通常希望能够在这一天得到亲朋好友的祝福和庆祝。然而&#xff0c;随着人们生活节奏的加快&#xff0c;很多人表示自己很容易忘记他人的生日&#xff0c;导致不能够及时送出祝福和礼物。如果经常忘记亲朋好友的生日&…