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

相关推荐
geovindu3 分钟前
python: Simple Factory Pattern
开发语言·python·设计模式·简单工厂模式
祁同伟.4 分钟前
【C++】哈希的应用
开发语言·数据结构·c++·算法·容器·stl·哈希算法
点云SLAM4 分钟前
Tracy Profiler 是目前 C++ 多线程程序实时性能分析工具
开发语言·c++·算法·slam·算法性能分析·win环境性能分析·实时性能分析工具
每天回答3个问题5 分钟前
leetcodeHot100|148.排序链表
数据结构·c++·链表·ue4
承渊政道11 分钟前
C++学习之旅【unordered_map和unordered_set的使⽤以及哈希表的实现】
c语言·c++·学习·哈希算法·散列表·hash-index
未来之窗软件服务12 分钟前
浏览器开发CEF(二十二)C#闪退处理——东方仙盟元婴期
开发语言·人工智能·c#·浏览器开发·仙盟创梦ide·东方仙盟
Trouvaille ~14 分钟前
【贪心算法】专题(一):从局部到全局,数学证明下的最优决策
c++·算法·leetcode·面试·贪心算法·蓝桥杯·竞赛
小钻风336617 分钟前
Java 8 流式编程
java·开发语言·windows
czhc114007566323 分钟前
c# 312 事件 委托
开发语言·c#
xyq202425 分钟前
R 基础运算
开发语言