将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.mzph.cn/news/237871.shtml

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

相关文章

HarmonyOS 应用事件打点开发指导

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志&#xff0c;难以识别其中的关键信息。因此&#xff0c;应用开发者需要一种数据打点机制&#xff0c;用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent 是在系统层面…

Kafka集群架构原理(待完善)

kafka在zookeeper数据结构 controller选举 客户端同时往zookeeper写入, 第一个写入成功(临时节点), 成为leader, 当leader挂掉, 临时节点被移除, 监听机制监听下线,重新竞争leader, 客户端也能监听最新leader leader partition自平衡 leader不均匀时, 造成某个节点压力过大, …

SpringCloudGateway网关处拦截并修改请求

SpringCloudGateway网关处拦截并修改请求 需求背景 老系统没有引入Token的概念&#xff0c;之前的租户Id拼接在请求上&#xff0c;有的是以Get&#xff0c;Param传参形式&#xff1b;有的是以Post&#xff0c;Body传参的。需要在网关层拦截请求并进行请求修改后转发到对应服务。…

工业自动化的通信核心—钡铼技术R10A工业级路由器介绍

随着工业自动化的快速发展&#xff0c;工业通信技术也日新月异。在这个信息时代&#xff0c;工业通信设备的稳定性、可靠性和高效性变得尤为重要。作为工业自动化的核心部件之一&#xff0c;钡铼技术R10A工业级路由器以其出色的性能和卓越的功能在行业内赢得了广泛的赞誉。本文…

docker学习(十二、Redis主从容错迁移)

文章目录 一、容错切换迁移挂一个master节点6381&#xff0c;查看集群信息主节点挂一个&#xff0c;对应从节点切换为主节点&#xff0c;数据获取测试恢复挂的主节点&#xff0c;主从关系变化 二、小思考 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分…

C# SQLite基础工具类

目录 1、安装System.Data.SQLite工具包 2、创建数据库 3、数据库的连接与断开 4、执行一条SQL语句 5、批量执行sql语句 6、返回首行首列值 7、执行sql语句返回datatable 1、安装System.Data.SQLite工具包 2、创建数据库 /// <summary> /// 数据库路径 …

Github2023-12-22开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-22统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目2非开发语言项目2C项目1C项目1HTML项目1Dart项目1 Tailwind CSS&#xff1a;快速U…

kibana-7.15.2 一分钟下载、安装、部署 linux

文章目录 一、下载安装部署 1. 下载2. 解压3. 修改配置 二、kibana 启动 2.1. 创建kibana 用户2.2. 赋予权限2.3. 切换用户2.4. kibana启动2.5. 监控服务2.6. 监控服务2.7. kibana停止2.8. 效果图 三、kibana 启动2 3.1. 浏览器访问3.2. 效果图 一、下载安装部署 https:…

HTML美化网页

使用CSS3美化的原因 用css美化页面文本,使页面漂亮、美观、吸引用户 可以更好的突出页面的主题内容,使用户第一眼可以看到页面主要内容 具有良好的用户体验 <span>标签 作用 能让某几个文字或者某个词语凸显出来 有效的传递页面信息用css美化页面文本&#xff0c;使页面漂…

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析&#xff0c;编译器对代码的优化 锁优化 jvm 在加锁的过程中&#xff0c;会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

易点易动设备管理系统:解决企业设备管理难题的利器

在现代企业中&#xff0c;设备管理是一个至关重要的环节。无论是制造业、物流业还是服务业&#xff0c;设备的高效管理对于企业的运营和竞争力都至关重要。然而&#xff0c;许多企业在设备管理方面面临着各种挑战。为了解决这些难题&#xff0c;易点易动设备管理系统应运而生。…

[vue]Echart使用手册

[vue]Echart使用手册 使用环境Echart的使用Echart所有组件和图表类型Echart 使用方法 使用环境 之前是在JQuery阶段使用Echart&#xff0c;直接引入Echart的js文件即可&#xff0c;现在是在vue中使用,不仅仅时echarts包&#xff0c;还需要安装vue-echarts&#xff1a; "…

Pycharm解释器的配置: System Intgerpreter 、Pipenv Environment、Virtualenv Environment

文章目录 前提1. 环境准备2. 了解虚拟环境 一、进入Interpreter设置页二、添加Interpreter1. 方式一2. 方式二 三、 System Interpreter四、 Pipenv Environment前提条件&#xff1a;详细步骤1&#xff09; 选择pipenv2&#xff09; 设置Base Interpreter3&#xff09; 设置Pip…

基于Java SSM框架实现人事员工考勤签到请假管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人事员工考勤签到请假管理系统演示 摘要 在高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对人事管理系统越来越重视&#xff0…

css图片属性,图片自适应

CSS 图片属性指南&#xff1a;background-size 和 object-fit 在前端开发中&#xff0c;使用图片是非常常见的。为了让图片在网页中显示得更好&#xff0c;CSS 提供了多种属性来调整和控制图片的大小和布局。其中&#xff0c;background-size 和 object-fit 是两个常用的属性&a…

制作系统安装盘教程——烧录Windows原版镜像

前言 本次教程不经过WinPE工具进行安装Windows原版镜像&#xff0c;而是直接把系统镜像文件直接烧录进U盘&#xff0c;这样做的好处是不经过WinPE安装Win系统的过程&#xff0c;避免有些带木马病毒的WinPE在安装系统的过程把木马病毒带进系统&#xff0c;从而导致文件泄漏。 开…

【JavaWeb学习笔记】13 - JSP浏览器渲染技术

JSP 一、JSP引入 1.JSP现状 1.目前主流的技术是前后端分离(比如: Spring Boot Vue/React),我们会讲的.[看一下] 2. JSP技术使用在逐渐减少&#xff0c;但使用少和没有使用是两个意思&#xff0c;一些老项目和中小公司还在使用JSP&#xff0c;工作期间,你很有可能遇到JSP …

【设计模式-2.5】创建型——建造者模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型设计模式中的最后一个&#xff0c;建造者模式&#xff1b; 入学报道 创建型模式&#xff0c;关注于对象的创建&#xff0c;建造者模式也不例外。假设现在有一个场景&#xff0c;高校开学&#xff0c;学生、教师、职工都…

12.21

一、注意事项 1.CtrlShiftT用于从jar中查找类&#xff0c;这个eclipse键盘快捷键可以帮助快速找到类 2.更新upm和rest遇到重复解决方法 把upm文件里面多出来的三行代码删掉&#xff0c;右击upm文件&#xff0c;点击小组&#xff0c;点击标记为已解决&#xff0c;点击OK&#x…

Web前端-JavaScript(对象)

文章目录 1.对象1.1 概念1.2 创建对象三种方式**对象字面量创建对象**&#xff1a;new Object创建对象构造函数创建对象 1.3 遍历对象 2.作用域1.1 概述1.2 全局作用域1.3 局部作用域1.4 JS没有块级作用域1.5 变量的作用域1.6 作用域链1.7 预解析 1.对象 1.1 概念 什么是对象 …