#pragma once
#include <windows.h>
#include <string>
// #include <iostream> class ServiceManage
{
public:
ServiceManage() = default;
~ServiceManage() = default; /**
* \brief Start service based on service name
* \param strServiceName
* \return
*/
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;
} /**
* \brief Stop service based on service name
* \param strServiceName
* \return
*/
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 bool Exist_Service(const std::string& strServiceName)
{
bool bResult = false;
const int MAX_SERVICE_SIZE = 1024 * 64;
// const int MAX_QUERY_SIZE = 1024 * 8;
if (strServiceName.empty())
return bResult;
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(SCMan == NULL) {
// std::cout << "OpenSCManager failed." << std::endl;
return bResult;
}
LPENUM_SERVICE_STATUS service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL; service_status = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, MAX_SERVICE_SIZE); BOOL ESS = EnumServicesStatus(SCMan,
SERVICE_WIN32,
SERVICE_STATE_ALL,
(LPENUM_SERVICE_STATUS)service_status,
MAX_SERVICE_SIZE,
&cbBytesNeeded,
&ServicesReturned,
&ResumeHandle);
if(ESS == NULL) {
// std::cout << "EnumServicesStatus Failed." << std::endl;
return bResult;;
} for(int i = 0; i < static_cast<int>(ServicesReturned); i++) {
if (0 != strcmp(service_status[i].lpDisplayName, strServiceName.c_str())) continue;
// std::cout << service_status[i].lpDisplayName << " ";
bResult = true;
}
CloseServiceHandle(SCMan);
return bResult;
} /**
* \brief Query service status based on service name
* \param strServiceName
* \return
*/
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;
}
private: };

Windows 端使用 C++ 服务操作类的更多相关文章

  1. 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

    注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...

  2. windows下搭建svn服务端、客户端

    1.安装SVN服务器subversion以及客户端TortoiseSVN,在网上下载windows版的subversion,TortoiseSVN并安装,比如我的服务端安装在了D:\Program F ...

  3. windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)

    /// <summary> /// 系统控制类,关机,关闭显示器,打开屏幕保存程序等 /// </summary> public class SystemPowerContro ...

  4. 在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端

    在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 在服务器端启动jupyter notebook服务,在 ...

  5. Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表

    Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表 列表如下 Port Protocol Network Service System Service System Servic ...

  6. 请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是

    请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是 ServiceBase的子类. static void Main() { ServiceBase[] ...

  7. Redis的Windows端开发连接Linux端以及相应的代码实现

    在Windows端开发连接需要进行配置文件的配置: 在redis.conf配置文件中 将protected-mode yes,修改为protected-mode no:不保护redis # By de ...

  8. 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习

    反射实现Model修改前后的内容对比   在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...

  9. Util应用程序框架公共操作类(四):验证公共操作类

    为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...

  10. Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)

    本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...

随机推荐

  1. 关于一类最优解存在长度为 $k$ 的循环节的问题

    灵感来源 问题形式:给定长度为 \(n\) 的序列,要求选出一些位置,使这些位置满足限制条件 \(T\),其中 \(T\) 可以表述为一个长度为 \(k\) 的环满足条件 \(T'\),选出第 \(i ...

  2. Flask SocketIO 实现动态绘图

    Flask-SocketIO 是基于 Flask 的一个扩展,用于简化在 Flask 应用中集成 WebSocket 功能.WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议,常用于 ...

  3. java集合框架(二)LinkedList的常见使用

    @[toc]## 一.什么是LinkedList LinkedList是Java中的一个双向链表. 它实现了List和Deque接口,在使用时可以像List一样使用元素索引,也可以像Deque一样使用 ...

  4. CortexM外设:NVIC 嵌套向量中断控制器

    优先级分组Priority Group 使能Enabled 抢占优先级Preemption Priority 子优先级Sub Priority 外部中断线 EXTI Line 定时器中断 TIM1 u ...

  5. serdes IP集成使用常见踩坑问题

    1.不支持小数分频,或者小数分频后频偏过大部分速率配置无法使用. 2.CDR 不稳定,经常无法锁定,或者温变时出现失锁情况,以及cdr lock信号无法准备上报状态. 3.CORE内部多个lane之间 ...

  6. Spring系列:基于Spring-AOP和Spring-Aspects实现AOP切面编程

    目录 一.概念及相关术语 概念 相关术语 ①横切关注点 ②通知(增强) ③切面 ④目标 ⑤代理 ⑥连接点 ⑦切入点 作用 二.基于注解的AOP 技术说明 准备工作 创建切面类并配置 各种通知 切入点表 ...

  7. Vue2路由嵌套是注意子路由path问题

    1.当子路由以/开始时,它会被视为根路由,并且会显示在URL的根路径中 2.当子路由不以/开始时,它将被视为相对路径,相对于父路由的路径

  8. 安装了华企盾DSC防泄密,所有进程的加密文件都无法打开

    用pchunter等工具查看系统回调中是否有文件厂商不存在的(system目录的除外),在恢复模式删除掉,或者用360系统急救箱查杀一下

  9. 这些 git 高级命令你知道几个

    大家好,我是 dom 哥.今天给大家分享几个 git 的高级应用. git 是目前最流行的版本控制工具.git 玩的 6 不 6,轻则影响自己的开发幸福指数 ,重则影响下班时间 .本文介绍一些日常开发 ...

  10. StringBuilder、StringBuffer

    StringBuilder 1.concat() 拼接字符串 2.indexOf() 查找 3.replace() 替换 4.subString(1,2) 截取 0,1,2 1开始 2结束 Strin ...