vc操作windows服务(services.msc)
1.操作服务类的头文件WindowsService.h:
#pragma once
class CWindowsService
{
public:
CWindowsService(void);
public:
~CWindowsService(void);
enum SEV_STATUS
{
SEV_ERROR = 0x00,
SEV_NO = 0x01,
SEV_HAVE = 0x02,
SEV_RUNING = 0x03,
SEV_STOPED = 0x04
};
public:
BOOL AddService(const char*pSourceName,const char*pServiceName,const char*pDisName,const char*pPara);
BOOL RemoveService(const char*pServiceName);
BYTE CheckServiceStatus(const char*pServiceName);
BOOL StartSevice(const char*pServiceName);
BOOL StopSevice(const char*pServiceName);
BOOL GetSevicePath(const char*pServiceName,CString &strServicePath);
BOOL GetCurPath(CString &strCurPath);
};
2.操作服务类的执行文件WindowsService.cpp:
/**********************************************************************************
windows 服务操作类
write by fjssharpsword
2010-12-23
************************************************************************************/
#include "StdAfx.h"
#include "WindowsService.h"
#include "winsvc.h"
CWindowsService::CWindowsService(void)
{
}
CWindowsService::~CWindowsService(void)
{
}
/*****************************************************
创建服务说明
如 m_Test.AddService("C://Test//Test.exe","MyServiceName","DisplayName",NULL);
pPara 为参数有些服务需
*****************************************************/
BOOL CWindowsService::AddService(const char*pSourceName,const char*pServiceName,const char*pDisName,const char*pPara)
{
SC_HANDLE hSC = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE );
if ( hSC == NULL )
{
return FALSE;//_ERROR_;
}
CString strBinnaryPathName;
strBinnaryPathName.Format("%s%s%s %s","/"",pSourceName,"/"",pPara);
SC_HANDLE hSvc = CreateService( hSC,
pServiceName, //服务名称
pDisName, //显示名称
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
strBinnaryPathName,
NULL,
NULL,
NULL,
NULL,
NULL );
if( hSvc == NULL )
{
::CloseServiceHandle( hSC );
return FALSE;//_ERROR_;
}
::CloseServiceHandle( hSvc );
::CloseServiceHandle( hSC );
return TRUE;
}
/*
**************************************************
删除服务
**************************************************
*/
BOOL CWindowsService::RemoveService(const char*pServiceName)
{
// UnInstall the XService from Service Control Manager Database
SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, SC_MANAGER_ALL_ACCESS);
if( hSC == NULL)
{
return FALSE;
}
SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_STOP | DELETE/*SERVICE_ALL_ACCESS*/);
if( hSvc == NULL)
{
::CloseServiceHandle( hSC);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hSvc, SERVICE_CONTROL_STOP, &status);
if ( !::DeleteService(hSvc))
{
DWORD _error =GetLastError();//ERROR_ACCESS_DENIED
return FALSE;
}
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return TRUE;
}
/*
**************************************************
检测状态
**************************************************
*/
BYTE CWindowsService::CheckServiceStatus(const char*pServiceName)
{
SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
return SEV_ERROR;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
::CloseServiceHandle( hSC);
return SEV_NO;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
// TRACE( "Get Service state error。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return SEV_ERROR;
}
if(status.dwCurrentState == SERVICE_RUNNING)
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return SEV_RUNING;
}
else if(status.dwCurrentState == SERVICE_STOPPED)
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return SEV_STOPED;
}
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return SEV_ERROR;
}
/*
**************************************************
启动服务
**************************************************
*/
BOOL CWindowsService::StartSevice(const char*pServiceName)
{
SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
return FALSE;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
::CloseServiceHandle( hSC);
return FALSE;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
//TRACE( "Get Service state error。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
if( status.dwCurrentState != SERVICE_RUNNING) //如果处于停止状态则启动服务,否则返回
{
// 启动服务
if( ::StartService( hSvc, NULL, NULL) == FALSE)
{
//TRACE( "start service error。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
// 等待服务启动
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
::Sleep(500);
QueryServiceStatus( hSvc, &status);
if( status.dwCurrentState == SERVICE_START_PENDING)
{
//AfxMessageBox( "start success。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
::Sleep( status.dwWaitHint);
QueryServiceStatus( hSvc, &status);
if( status.dwCurrentState == SERVICE_RUNNING)
{
//AfxMessageBox( "start success。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
else
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
}
}
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
/*
**************************************************
停止服务
**************************************************
*/
BOOL CWindowsService::StopSevice(const char*pServiceName)
{
SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
return FALSE;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService( hSC, pServiceName,
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
::CloseServiceHandle( hSC);
return FALSE;
}
// 获得服务的状态
SERVICE_STATUS status;
if( ::QueryServiceStatus( hSvc, &status) == FALSE)
{
//TRACE( "Get Service state error。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
//如果处于停止状态则启动服务,否则停止服务。
if( status.dwCurrentState == SERVICE_RUNNING)
{
// 停止服务
if( ::ControlService( hSvc, SERVICE_CONTROL_STOP, &status) == FALSE)
{
//TRACE( "stop service error。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
// 等待服务停止
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
//::Sleep( status.dwWaitHint);
::Sleep(1000);
QueryServiceStatus( hSvc, &status);
if( status.dwCurrentState == SERVICE_STOPPED)
{
//AfxMessageBox( "stop success。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
::Sleep(3000);
QueryServiceStatus( hSvc, &status);
if( status.dwCurrentState == SERVICE_STOPPED)
{
//AfxMessageBox( "stop success。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
::Sleep( status.dwWaitHint);
QueryServiceStatus( hSvc, &status);
if( status.dwCurrentState == SERVICE_STOPPED)
{
//AfxMessageBox( "stop success。");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
else
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
}
}
return TRUE;
}
BOOL CWindowsService::GetSevicePath(const char*pServiceName,CString & strServicePath)
{
SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, SC_MANAGER_ALL_ACCESS);
if( hSC == NULL)
{
return FALSE;
}
// 打开服务。
SC_HANDLE hSvc = ::OpenService( hSC, pServiceName,SERVICE_ALL_ACCESS);
if( hSvc == NULL)
{
::CloseServiceHandle( hSC);
return FALSE;
}
LPQUERY_SERVICE_CONFIG pServiceConfig;
DWORD cbBufSize = 1024*8;//sizeof(SERVICE_DESCRIPTION_STRUCT);
DWORD cbBytesNeeded;
CString strPath;
pServiceConfig = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, cbBufSize); //注意分配足够的空间
QueryServiceConfig( hSvc, pServiceConfig ,cbBufSize, &cbBytesNeeded);
strPath = pServiceConfig->lpBinaryPathName;
strPath.Replace('"',' ');
//int iFind = strPath.Find("");
//strPath = strPath.Left(iFind+1);
int iFind = strPath.Find("exe");
strPath = strPath.Left(iFind+3);
strServicePath = strPath;
::LocalFree(pServiceConfig);
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return TRUE;
}
BOOL CWindowsService::GetCurPath(CString &strCurPath)
{
char szTemp[MAX_PATH] = {0};
::GetModuleFileName(NULL, szTemp, sizeof(szTemp)-1);
int iLen = (int)strlen(szTemp);
for(int i = iLen - 1; i >= 0; i--)
{
if (szTemp[i] == '//')
{
break;
}
else
{
szTemp[i] = 0;
}
}
strCurPath = szTemp;
return TRUE;
}
3.调用案例:
#include "WindowsService.h"
void CDemoSvrDlg::OnOK()
{
// TODO: Add extra validation here
CWindowsService ws;
ws.AddService("D://demo.exe","demo","demo",NULL);//创建
ws.StartSevice("demo");//启动
if(ws.CheckServiceStatus("demo") == 0x03)
AfxMessageBox("启动状态");
ws.StopSevice("demo");
if(ws.CheckServiceStatus("demo") == 0x04)
AfxMessageBox("停止状态");
ws.RemoveService("demo");//删除
//CDialog::OnOK();
}
vc操作windows服务(services.msc)相关推荐
- Windows系统 services.msc命令详解,Windows命令行查看本地服务
「作者主页」:士别三日wyx 第一步.打开cmd 按下 win 键,输入 cmd 后回车,打开「命令提示符」 第二步.查看系统版本 在打开的cmd窗口中,输入 services.msc 后回车,即可在 ...
- 如何打开windows的服务services.msc
两种开启方式:services.msc 方法一:点击win+r回车,而后输入services.msc 回车就OK了. 方法二:手动开启:开始-运行,而后输入services.msc 回车就OK了. 转 ...
- C#开发人员能够可视化操作windows服务
使用C#开发自己的定义windows服务是一个很简单的事.因此,当.我们需要发展自己windows它的服务.这是当我们需要有定期的计算机或运行某些程序的时候,我们开发.在这里,我有WCF监听案例,因为 ...
- VC++ 创建Windows服务
我在开发的时候用到了DLL里面的函数,开始的时候采用的静态导入的方法,但是发现服务开机启动以后就死掉了,这里不是DLL路径的问题. 没办法,自己只得用动态导入的方法,还好,服务自动开机运行了,还算正常 ...
- VC++的windows服务
项目建立: VS2008->ATL项目->服务exe 服务部署: 在VS2008中新建的ATL项目,在网上看到的流程中都会有注册服务这一项. 但是对服务的注册都是只给了一个指令,一句话带过 ...
- VC制作 Windows服务 安装包
C++跟.NET 不同,没有线程的安装程序类用来继承和操作 所以,一些自定义的东西,之好采用VBS脚本的方式来进行 以下转载: http://hi.baidu.com/feng_hit/item/6 ...
- C# 创建Windows服务。服务功能:定时操作数据库
一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...
- 规划以主机命名的网站集 (Windows SharePoint Services)
摘自MSDN:http://technet.microsoft.com/zh-cn/library/cc288637.aspx Windows SharePoint Services 3.0 既支持以 ...
- Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)
转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...
最新文章
- 怎么安装MYSQL5.0的JDBC驱动
- mysql alert on delete cascade_如何在mysql中删除级联使用?(How do I use on delete cascade in mysql?)...
- day09_读写分离_Atlas小记
- 190906描述笔记
- UVA12321 Gas Stations【贪心】
- 使用OpenSSL颁发CA证书
- 汇编语言工具(DosBox、debug)下载与安装教程
- 遥感式雷达监测水位流速设备
- php 公众号 欢迎,如何正确编写微信公众号欢迎语
- OpenStreetMap 2020年全球数据导入benchmark
- [ 树形DP ] BZOJ4987
- 基于JAVA基于Web的上门家教系统的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
- pat甲级考试报名费_每日一感——记第一次PAT甲级考试之感想
- 【程序员入门记录】ThinkPad E470改造记录——换屏
- 计算机作文范文,未来计算机作文范文.docx
- Access denied for user 'mysql用户名'@'主机或IP' (using password: YES)'
- 树莓派3 之 USB摄像头安装和使用
- Java中的Supplier接口
- 如何将PDF转为Word使用?安利3个可以转换的软件
热门文章
- connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...
- Domain Model
- kafka shell
- CentOS-7.0.中安装与配置Tomcat-7的方法
- springboot profiles
- Struts(七):action配置文件之通配符映射
- hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)
- tomcat集群 (自带Cluster集群)
- iOS - UITableViewCell Custom Selection Style Color
- Linux之read命令使用