Windows 端使用 C++ 服务操作类
#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++ 服务操作类的更多相关文章
- 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)
注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...
- windows下搭建svn服务端、客户端
1.安装SVN服务器subversion以及客户端TortoiseSVN,在网上下载windows版的subversion,TortoiseSVN并安装,比如我的服务端安装在了D:\Program F ...
- windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)
/// <summary> /// 系统控制类,关机,关闭显示器,打开屏幕保存程序等 /// </summary> public class SystemPowerContro ...
- 在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端
在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 在服务器端启动jupyter notebook服务,在 ...
- Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表
Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表 列表如下 Port Protocol Network Service System Service System Servic ...
- 请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是
请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是 ServiceBase的子类. static void Main() { ServiceBase[] ...
- Redis的Windows端开发连接Linux端以及相应的代码实现
在Windows端开发连接需要进行配置文件的配置: 在redis.conf配置文件中 将protected-mode yes,修改为protected-mode no:不保护redis # By de ...
- 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习
反射实现Model修改前后的内容对比 在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...
- Util应用程序框架公共操作类(四):验证公共操作类
为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...
- Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)
本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...
随机推荐
- 【免费】小傅哥 DDD 开发小册
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 如果在面试的时候,面试官问你DDD是什么,你怎么解释?是不是感 ...
- Flask 使用Jinja2模板引擎
Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持.灵活性.高效性和安全性而备受推崇.最初受Django模板引擎启发,Jinja2为Flask提供了强大 ...
- phpmyadmin修改上传限制,phpmyadmin修改上传文件大小限制,docker版本phpmyadmin
我用的是DOCKER 版本的phpmyadmin 修改/usr/local/etc/php/conf.d/phpmyadmin-misc.ini 内的限制变量文件为 100M,重启docker 容器后 ...
- 【python】大作业进度一 | 解析题目
1.爬取生成txt文件(整本小说) 2.图形化界面的实现
- 【uniapp】【外包杯】学习笔记day05 | 页面制作+git安装+云存储
没啥好说的,昨天的任务没有完成,网上说的是一套,我这边出现的情况又是一种,欸...善莫大焉 今天又重新开始搞,有了一点起色,然后用了git进行云存储 明天计划把这个给搞定吧,累发财了 git做完了 在 ...
- .NET微信网页开发相关文章教程
前言 今天我们主要总结一下.NET微信网页开发的相关文章教程. 微信网页开发详细文档可以看微信官方文档:https://developers.weixin.qq.com/doc/offiaccount ...
- 吉特日化MES & 实施Windows Server 远程登录的问题
Windows远程登录提醒:由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开.请跟服务器管理员联系. 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开.请跟服务器管理员联系. ...
- 华企盾DSC:wps个人模式无策略组新建的文件仍然加密
解决方法:右键wps安装目录手动解密即可(原因:wps模板被加密导致)
- quill富文本编辑器quill粘贴图片上传服务器
强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...
- 解决QObject::moveToThread: Current thread (0x56059f9b0f70) is not the object's t
对 opencv 降级 pip install opencv-python==4.1.2.30