windows 服务的安装、启动、状态查询 c++实现


#ifndef __SERVICEMANAGE_H__
#define __SERVICEMANAGE_H__
#include <windows.h>
#include <string>
class ServerManage
{
public:
    ServerManage() {}
    ~ServerManage() {}
    /*
    @ 根据服务名启动服务
    */
    inline bool Start_Server(const std::string& strServiceName)
    {
        bool bResult = false;
        if (strServiceName.empty())
        {
            return bResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    if (service_status.dwCurrentState == SERVICE_STOPPED)
                    {
                        if (!::StartService(sc_service, NULL, NULL))
                        {
                            ::CloseServiceHandle(sc_service);
                            ::CloseServiceHandle(sc_Manager);
                            return bResult;
                        }
                        while (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                            (LPBYTE)&service_status,
                            dwpcbBytesNeeded,
                            &dwpcbBytesNeeded))
                        {
                            Sleep(service_status.dwWaitHint);
                            if (service_status.dwCurrentState == SERVICE_RUNNING)
                            {
                                bResult = true;
                                break;
                            }
                        }
                    }
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return bResult;
    }
    /*
    @根据服务名停止服务
    */
    inline bool Stop_Server(const std::string& strServiceName)
    {
        bool bResult = false;
        if (strServiceName.empty())
        {
            return bResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    SERVICE_CONTROL_STATUS_REASON_PARAMSA service_control_status;
                    DWORD dwerror = NULL;
                    ZeroMemory(&service_control_status, sizeof(SERVICE_CONTROL_STATUS_REASON_PARAMSA));
                    if (service_status.dwCurrentState == SERVICE_RUNNING)
                    {
                        service_control_status.dwReason = SERVICE_STOP_REASON_FLAG_PLANNED | SERVICE_STOP_REASON_MAJOR_APPLICATION | SERVICE_STOP_REASON_MINOR_NONE;;
                        if (!::ControlServiceExA(sc_service, SERVICE_CONTROL_STOP, SERVICE_CONTROL_STATUS_REASON_INFO, &service_control_status))
                        {
                            dwerror = ::GetLastError();
                            ::CloseServiceHandle(sc_service);
                            ::CloseServiceHandle(sc_Manager);
                            return bResult;
                        }
                        while (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                            (LPBYTE)&service_status,
                            dwpcbBytesNeeded,
                            &dwpcbBytesNeeded))
                        {
                            Sleep(service_status.dwWaitHint);
                            if (service_status.dwCurrentState == SERVICE_STOPPED)
                            {

                                bResult = true;
                                break;
                            }
                        }
                    }
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return bResult;
    }
    /*
    @根据服务名查询服务状态
    */
    inline DWORD Query_Server_Status(const std::string& strServiceName)
    {
        DWORD nResult = 0;
        if (strServiceName.empty())
        {
            return nResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    nResult = service_status.dwCurrentState;
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return nResult;
    }
    /*
    @ 根据服务名 安装服务
    */
    inline bool SerivceInstall(const std::string& strServiceName) {
        bool bResult = false;
        SC_HANDLE schSCManger;
        SC_HANDLE schService;
        CHAR szPath[MAX_PATH];
        ZeroMemory(&szPath, MAX_PATH);
        if (!::GetModuleFileNameA(NULL, szPath, MAX_PATH)) {
            //LOG_INFO << "不能安装服务 (" << ::GetLastError() << ")\r\n";
            return;
        }
        //获取SCM数据库的句柄。
        schSCManger = ::OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (!schSCManger) {
            //LOG_INFO << "打开服务管理器失败 (" << ::GetLastError() << ")\r\n";
            return;
        }
        //创建服务
        schService = ::CreateServiceA(schSCManger, strServiceName.c_str(),
            strServiceName.c_str(),
            SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS,
            SERVICE_AUTO_START,
            SERVICE_ERROR_NORMAL,
            szPath,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);
        if (!schService)
        {
            //LOG_INFO << "创建服务失败 (" << ::GetLastError() << ")\r\n";
            ::CloseServiceHandle(schSCManger);
            return bResult;
        }
        else
        {
            //LOG_INFO << "创建服务成功\r\n";
            //::StartService(schService, NULL, NULL);
            bResult = true;
        }

        ::CloseServiceHandle(schService);
        ::CloseServiceHandle(schSCManger);
        return bResult;
    }
private:

};
#endif  //__SERVICEMANAGE_H__
 

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

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

相关文章

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

CentOS 系统给nodejs 项目安装依赖报错 make: g++: No such file or directory

我在给nodejs 项目安装依赖包的时候&#xff0c;报了如下错误 error /var/www/bsrm-api/node_modules/sleep: Command failed. Exit code: 1 Command: node-gyp rebuild Arguments: Directory: /var/www/bsrm-api/node_modules/sleep Output: gyp info it worked if it ends wi…

onnx快速部署YOLO模型

1、准备和环境 首先需要将yolov5模型训练好的最佳权重文件转化为.onnx格式以备使用。不会的小伙伴可以参考yolov5的官方文档&#xff0c;使用yolov5官方的 export.py 脚本进行转换&#xff0c;或者参考一些博客链接&#xff0c;这里不做详细解析。  基本环境配置&#xff0c;相…

PHP定义的变量 常量 静态变量等储存在内存什么位置?

在 PHP 中&#xff0c;变量、常量和静态变量都存储在内存中。它们的存储位置和生命周期有所不同。 变量&#xff1a;PHP 中的变量是动态类型的&#xff0c;它们的值和类型可以随时改变。当 PHP 脚本执行时&#xff0c;会在内存中分配一块空间来存储变量的值&#xff0c;这个空…

谱方法学习笔记-上(超详细)

谱方法学习笔记&#x1f4d2; 谱方法学习笔记-下(超详细) 声明&#xff1a;鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式&#xff0c; KaTeX \KaTeX KATE​X 与 L a T e X LaTeX LaTeX 不同&#xff0c;不支持直接的交叉引用命令&#xff0c;如\label和\eqref。 KaTeX \KaT…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型&#xff1a; Test1&#xff1a;STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request&#xff08;没有设置任何属性&#xff09;。STUN Server收到该请求后&#xff0c;通过端口{IP-S1:Port-S1}把…

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…

论如何让Spring Boot在高压力环境下依然与众不同

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容调优线程池优化线程池配置多样化设备支持分布式控制同步编程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客…

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址&#xff1a;An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本&#xff0c;但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此&#xff0c;…

HTTP协议,Web框架回顾

HTTP 请求协议详情 -请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本 -请求头---》key:value形式 -referer&#xff1a;上一次访问的地址 -user-agenet&#xff1a;客户端类型 -name&#xff1a;lqz -cookie&…

500元价位开放式耳机哪款好用、百元价位开放式耳机推荐

经常佩戴入耳式耳机的朋友应该都遇到过耳朵肿胀的感觉&#xff0c;这个时候&#xff0c;就是耳朵在告诉你&#xff0c;该休息一会了。如果耳朵里经常塞着耳机听歌&#xff0c;时间久了很容易引起听力衰退等问题&#xff0c;这是不可逆的伤害。各位朋友如果和我一样每天都戴着耳…

1120:最值交换

题目描述 有一个长度为n的整数序列。请写一个程序&#xff0c;先把序列中的最小值与第一个数交换&#xff0c;再把最大值与最后一个数交换。输出转换好的序列。 分别编写两个函数MinIndex()和MaxIndex()来计算最小值下标和最大值下标。 int MinIndex(int a[], int n); //函数返…

大数据学习(25)-hive核心总结

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

如何在centos服务器上安装docker保姆教程

在CentOS 7上安装Docker 更新系统 sudo yum update 安装必要的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添加Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装Docker引擎 sudo…

封装websocket并在vuejs中调用

1、创建JS文件ce-websocket-util.js class CeWebsocketUtil {websocket null;reConnectTimes 0; // 失败后重新连接次数wsInterVal null; // 重新连接定时器maxReConnectTimes 10; // 最大连接次数,默认10次reIntervalTime 60 * 1000; // 重连间隔时间&#xff0c;默认1m…

Java CopyOnWriteArrayList

在 Java 的集合中, List 是一个很高频使用的集合中, 但是平时使用的 ArrayList, LinkedList 都是线程不安全的。 线程可见性不支持, 内部的 fast-fail 机制等都是表明他们不适合高频发的场景使用。如果我们需要一个线程安全的列表集合 使用古老的集合类 Vector通过 Collections…

C++基础 -12- 拷贝构造(浅拷贝)

系统会自动生成浅拷贝&#xff0c;就相当于直接赋值 #include "iostream"using namespace std;class base { public:base(int a, int b) : a(a), b(b){}int a;int b; }; int main() {base newbase1(10, 20);base newbase2 newbase1;cout << newbase1.a <…

另类解决方案Apache(httpd) 报错You don‘t have permission to access xxx /on this server

在一个Kylix系统&#xff08;应该是Redhat/Centos改版&#xff09;的httpd服务器的文档目录下新增加了一个文件&#xff0c;权限也都设置成了644&#xff0c;结果从浏览器访问时&#xff0c;报错&#xff1a;Apache(httpd) 报错You don’t have permission to access /on this …

数据库的增删查改(CRUD)基础版

CRUD: create增加、retrieve查询、update更新、delete删除 注意一点&#xff1a;MySQL对大小写是不敏感的 目录 新增&#xff08;create&#xff09; 全列插入 指定列插入 多行插入 查询&#xff08;Retrieve&#xff09; 列查询 全列查询 指定列查询 表达式查询 …

【SpringBoot】调用外部接口

文章目录 原始httpClient请求使用RestTemplate方法Get请求Post 请求使用Feign进行消费 原始httpClient请求 /** description get方式获取入参&#xff0c;插入数据并发起流程* author lyx* params documentId* return String*///RequestMapping("/submit/{documentId}&quo…