Win32 服务控制
2015-08-04 00:42
627 查看
一个类,用于全方位控制系统服务。
hServer.h
#ifndef __H_SERVER_H__
#define __H_SERVER_H__
#pragma once
#include <Windows.h>
class hServer {
public:
hServer (LPCTSTR servName);
~hServer ();
BOOL IsAutoRun ();
BOOL IsDemandRun ();
BOOL IsDisabled ();
BOOL SetAutoRun ();
BOOL SetDemandRun ();
BOOL SetDisabled ();
BOOL IsRunning ();
BOOL Start ();
BOOL Stop ();
private:
BOOL _ControlServices (BOOL (*callback)(SC_HANDLE));
BOOL _ControlServices (BOOL (*callback)(SC_HANDLE, SC_HANDLE));
LPTSTR h_servName;
};
#endif //__H_SERVER_H__
hServer.cpp
函数名比较简单,大家都看得懂,不做过多的注释。另外为了节省代码量,全篇代码均使用了函数式编程。所以请用高版本vs编译。。。
另外,hServer.cpp文件里面有一个宏,_NO_COPY_,如果定义了这个宏,类将不会单独分配一串内存用于存储服务名称。如果服务名称在堆中为常量,完全可以将这行代码取消注释。由于不涉及服务名称更改(需要控制多个服务请自行实例化多个对象),所以直接使用最简洁的C STRING。
hServer.h
#ifndef __H_SERVER_H__
#define __H_SERVER_H__
#pragma once
#include <Windows.h>
class hServer {
public:
hServer (LPCTSTR servName);
~hServer ();
BOOL IsAutoRun ();
BOOL IsDemandRun ();
BOOL IsDisabled ();
BOOL SetAutoRun ();
BOOL SetDemandRun ();
BOOL SetDisabled ();
BOOL IsRunning ();
BOOL Start ();
BOOL Stop ();
private:
BOOL _ControlServices (BOOL (*callback)(SC_HANDLE));
BOOL _ControlServices (BOOL (*callback)(SC_HANDLE, SC_HANDLE));
LPTSTR h_servName;
};
#endif //__H_SERVER_H__
hServer.cpp
#include "hServer.h" //#define _NO_COPY_ hServer::hServer (LPCTSTR servName) { #ifdef _NO_COPY_ h_servName = const_cast<LPTSTR>(servName); #else //_NO_COPY_ h_servName = new TCHAR [lstrlen (servName) + 1]; lstrcpy (h_servName, servName); #endif //_NO_COPY_ } hServer::~hServer () { #ifndef _NO_COPY_ delete h_servName; #endif //_NO_COPY_ } BOOL hServer::IsAutoRun () { return _ControlServices ([] (SC_HANDLE service) { QUERY_SERVICE_CONFIG *qsc = (LPQUERY_SERVICE_CONFIG)new BYTE [8 * 1024];//查询服务配置 DWORD d; BOOL bRet = FALSE; if (QueryServiceConfig (service, qsc, 8 * 1024, &d)) if (qsc->dwStartType <= 2)/*SERVICE_BOOT_START 0 SERVICE_SYSTEM_START 1 SERVICE_AUTO_START 2*/ bRet = TRUE; delete qsc; return bRet; }); } BOOL hServer::IsDemandRun () { return _ControlServices ([] (SC_HANDLE service) { QUERY_SERVICE_CONFIG *qsc = (LPQUERY_SERVICE_CONFIG)new BYTE [8 * 1024];//查询服务配置 DWORD d; BOOL bRet = FALSE; if (QueryServiceConfig (service, qsc, 8 * 1024, &d)) if (qsc->dwStartType == SERVICE_DEMAND_START) bRet = TRUE; delete qsc; return bRet; }); } BOOL hServer::IsDisabled () { return _ControlServices ([] (SC_HANDLE service) { QUERY_SERVICE_CONFIG *qsc = (LPQUERY_SERVICE_CONFIG)new BYTE [8 * 1024];//查询服务配置 DWORD d; BOOL bRet = FALSE; if (QueryServiceConfig (service, qsc, 8 * 1024, &d)) if (qsc->dwStartType == SERVICE_DISABLED) bRet = TRUE; delete qsc; return bRet; }); } BOOL hServer::SetAutoRun () { return _ControlServices ([] (SC_HANDLE scm, SC_HANDLE service) { SC_LOCK sclLock = LockServiceDatabase (scm); BOOL bRet = ChangeServiceConfig (service, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (sclLock) UnlockServiceDatabase (sclLock); return bRet; }); } BOOL hServer::SetDemandRun () { return _ControlServices ([] (SC_HANDLE scm, SC_HANDLE service) { SC_LOCK sclLock = LockServiceDatabase (scm); BOOL bRet = ChangeServiceConfig (service, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (sclLock) UnlockServiceDatabase (sclLock); return bRet; }); } BOOL hServer::SetDisabled () { return _ControlServices ([] (SC_HANDLE scm, SC_HANDLE service) { SC_LOCK sclLock = LockServiceDatabase (scm); BOOL bRet = ChangeServiceConfig (service, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (sclLock) UnlockServiceDatabase (sclLock); return bRet; }); } BOOL hServer::IsRunning () { return _ControlServices ([] (SC_HANDLE service) { SERVICE_STATUS status;//查询服务状态 if (QueryServiceStatus (service, &status)) return (BOOL) (status.dwCurrentState == SERVICE_RUNNING || status.dwCurrentState == SERVICE_START_PENDING); return FALSE; }); } BOOL hServer::Start () { return _ControlServices ([] (SC_HANDLE service) { SERVICE_STATUS status;//查询服务状态 if (QueryServiceStatus (service, &status)) { if (status.dwCurrentState == SERVICE_RUNNING) return TRUE; } return StartService (service, NULL, NULL); }); } BOOL hServer::Stop () { return _ControlServices ([] (SC_HANDLE service) { SERVICE_STATUS status;//查询服务状态 if (QueryServiceStatus (service, &status)) { if (status.dwCurrentState == SERVICE_STOPPED) return TRUE; } return ControlService (service, SERVICE_CONTROL_STOP, &status); }); } BOOL hServer::_ControlServices (BOOL (*callback)(SC_HANDLE)) { SC_HANDLE scm = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!scm) return FALSE; SC_HANDLE service = OpenService (scm, h_servName, SERVICE_ALL_ACCESS); if (!service) { CloseServiceHandle (scm); return FALSE; } BOOL bRet = callback (service); CloseServiceHandle (service); CloseServiceHandle (scm); return bRet; } BOOL hServer::_ControlServices (BOOL (*callback)(SC_HANDLE, SC_HANDLE)) { SC_HANDLE scm = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!scm) return FALSE; SC_HANDLE service = OpenService (scm, h_servName, SERVICE_ALL_ACCESS); if (!service) { CloseServiceHandle (scm); return FALSE; } BOOL bRet = callback (scm, service); CloseServiceHandle (service); CloseServiceHandle (scm); return bRet; }
函数名比较简单,大家都看得懂,不做过多的注释。另外为了节省代码量,全篇代码均使用了函数式编程。所以请用高版本vs编译。。。
另外,hServer.cpp文件里面有一个宏,_NO_COPY_,如果定义了这个宏,类将不会单独分配一串内存用于存储服务名称。如果服务名称在堆中为常量,完全可以将这行代码取消注释。由于不涉及服务名称更改(需要控制多个服务请自行实例化多个对象),所以直接使用最简洁的C STRING。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 将bat文件注册为windows系统服务的方法
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息