windows 服务的安装、启动、状态查询、停止操作c++实现
具体的自己看看代码 粘贴复制即可使用 卸载也很简单自己查看MSDN 加上就是
#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__
windows 服务的安装、启动、状态查询、停止操作c++实现的更多相关文章
- C#操作windows服务,安装、卸载、停止、启动
public class ServiceUtil { private string _ServiceName = string.Empty; private string _AppName = str ...
- C#.NET 操作Windows服务(安装、卸载)
注意点: 1.安装时要请求到管理员权限. 2.卸载前,一定要停止掉Windows服务,否则需要重启或注销电脑.代码无法停止服务时,使用services.msc来停止. 开始: 1.新建一个名为&quo ...
- Windows服务的安装卸载及错误查找
@echo off echo 清理原有服务项. . . %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil /U D:\abc\te ...
- 制作Windows服务和安装程序(C#版)
http://blog.sina.com.cn/s/blog_5f4ffa170100vt2b.html 1.创建服务项目: 打开VS 2005 编程环境,在C#中新建Windows服务程序 2.将安 ...
- 为C# Windows服务添加安装程序
最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安 ...
- (转)为C# Windows服务添加安装程序
本文转载自:http://kamiff.iteye.com/blog/507129 最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻 ...
- 使用InstallUtil对Windows服务进行安装与卸载
关于Visual Studio 2012中使用InstallUtil对Windows服务进行安装与卸载的文章,在MSDN中的http://msdn.microsoft.com/en-us/librar ...
- C# VS2010 windows服务的安装
可能是太过于懒惰的原因,研究个windows 服务的安装程序都花了大半天时间.在网上看了一些示例,大部分都言过其实,把过程搞得太过复杂,老是需要去研究如何利用InstallUtil.exe及其参数.事 ...
- windows服务,安装、启动、停止,配置,一个批处理文件搞定
相对而言,还是比较通用的吧,如果哪位仁兄有更好的实现方式,或者发现有不足之处,还请多多指教. @echo off echo.------------------------------------- ...
随机推荐
- 06Redis入门指南笔记(安全、通信协议、管理工具)
一:安全 1:可信的环境 Redis以简洁为美.在安全层面Redis也没有做太多的工作.Redis的安全设计是在"Redis运行在可信环境"这个前提下做出的.在生产环境运行时不能允 ...
- @loj - 2196@「SDOI2014」Lis
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定序列 A,序列中的每一项 Ai 有删除代价 Bi 和附加属性 ...
- uva 11806 Cheerleaders (容斥)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 在web.xml中配置SpringMVC
代码如下 <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.spr ...
- 如何编程实现快速获取一个整型数中的bit流中1的个数
int one_in_unsigned(unsigned n) { n =(n & ) & 0x55555555); n =(n & ) & 0x33333333); ...
- javascript 宽度和高度
宽度和高度 对于编写css代码时,宽度和高度就是width和height 但是在JavaScript中,还有其他的宽度和高度,比如offsetWidth,offsetHeight,clientX,cl ...
- pip安装软件包报Could not fetch URL
报这个错误的原因是python.org已经不支持TLSv1.0和TLSv1.1了.更新pip可以解决这个问题,但是你不能用命令 pip install --upgrade pip 做更新,因为TLS证 ...
- Python--day19--sys模块
sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys. ...
- Codeforces Round #177 (Div. 1 + Div. 2)
A. Polo the Penguin and Segments 模拟. B. Polo the Penguin and Matrix 每个数字模d余数必须一样. 枚举结果,可计算操作次数,取最小. ...
- Mysql5.5升级到5.7的过程已经踩到的坑
https://blog.csdn.net/u014534986/article/details/79699750 故事是这样子的,我们公司有几台老的mysql版本是5.5的,最近项目做了一些升级增加 ...