`

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服务程序

    在Windows操作系统中,服务是一种可以在用户界面未启动时运行的后台程序,它们通常用于提供系统功能或支持其他应用程序。在本教程中,我们将探讨如何使用Visual C++(简称VC)来创建一个Windows服务程序。 首先,...

    自写vc6.0windows服务及安装卸载+说明文档

    也可以在服务控制台(services.msc)手动操作。 3. **卸载服务**:当不再需要服务时,可以使用`DeleteService`函数或`sc delete`命令来卸载服务。同样,这可能包含在安装程序的卸载过程中。 **工程建立说明文档**...

    windows服务程序样本(demo) VC 6.0

    在Windows操作系统中,服务是一种特殊的后台应用程序,它们可以在用户登录之前或不与用户交互的情况下运行。Windows服务程序常用于执行持续的任务,如数据库维护、定时任务或者设备驱动支持。本项目是一个“windows...

    windows平台的服务开发示例

    Windows服务是Windows操作系统提供的一种运行环境,它允许应用程序在没有用户交互的情况下运行。服务有自己的启动、停止、暂停和恢复控制,并可以通过服务控制管理器(SCM)进行管理。服务有两种启动模式:手动和...

    vc之程序后台服务运行

    在Windows操作系统中,后台服务是实现程序自动化运行和持续后台操作的重要方式。"vc之程序后台服务运行"这个主题主要涉及如何使用C++编程语言,尤其是Microsoft Visual C++(简称VC)工具,来创建和管理Windows服务。...

    启动、关闭windows服务程序

    在Windows操作系统中,服务是一种特殊的后台执行程序,它们在用户登录之前或之后自动启动,为系统提供特定的功能。本文将详细讲解如何启动和关闭Windows服务,并重点介绍如何通过编程实现这一功能。 首先,Windows...

    ATL编写的Windows服务

    在Windows操作系统中,服务是一种特殊的后台程序,可以独立于用户界面运行,用于执行特定的任务,比如网络服务、定时任务等。ATL编写Windows服务能够使程序更加轻量级且高效。 本主题聚焦于如何使用ATL来创建...

    VC运行库(32-64位系统)

    这是因为系统缺失了应用程序启动文件所导致的,解决的办法就是重新安装一下运行库文件,然后按Win+R打开运行对话框,输入"Services.msc"运行服务,在右边栏下滑找到"Windows Modules Installer"双击打开,将启动类型...

    Windows下PostgreSQL与libpqxx的简单使用

    4. **启动服务**: 通过"services.msc"管理服务,找到PostgreSQL服务并启动。 5. **设置环境变量**: 添加数据目录到系统环境变量`PGDATA`,并更新`PATH`变量,包含PostgreSQL的bin目录。 **第二部分:编译libpqxx ...

    vc下出现无正确调试器问题的解决办法

    - 打开“服务管理”:可以通过运行命令`services.msc`快速打开服务列表。 - 查找并开启Machine Debug Manager服务:确保其状态为已启动,并且启动类型设置为自动。 2. **重新注册调试组件** - 打开命令提示符...

    windows下解压安装mysql5.6.40所需dll打包

    7. **启动MySQL服务**:通过服务管理器(services.msc)启动MySQL服务,或者在命令行中使用`net start MySQLServiceName`命令启动。 8. **验证安装**:使用MySQL客户端工具(如MySQL Workbench)连接到新安装的...

    计算机系统中apache中间件的安装包

    5. 启动Apache服务,可以通过控制面板或命令行工具(如"services.msc")操作。 6. 验证安装,打开浏览器输入"http://localhost",如果出现Apache的欢迎页面,说明安装成功。 运维Apache中间件的过程中,需要注意...

    Windows 2016学习指南之IIS篇

    Windows Server 2016是微软公司在2016年发布的服务器操作系统,它包含了众多的新特性和增强功能,其中IIS(Internet Information Services)作为Windows服务器的重要组成部分,也得到了相应的更新和改进。...

    apache 64位,验证成功

    5. 安装完成后,通过服务管理器(services.msc)启动Apache服务,确认服务状态为"正在运行"。 配置Apache: 1. 打开Apache的配置文件"httpd.conf",一般位于"Apache24\conf"目录下。 2. 查找"#ServerRoot",设置为...

    Broadcom Product Brief BCM7404

    - **AVC/MPEG-2/VC-1 Decoder:** The BCM7404 supports decoding of multiple video formats including H.264/AVC (up to level 4.1), VC-1 (advanced profile @ level 3), and MPEG-2. - **DivX Support:** The ...

    vc++获得网卡MAC地址源代码

    在Windows操作系统中,获取计算机网卡的MAC(物理)地址是一项常见的编程任务,尤其是在网络通信或者设备识别的应用中。在给定的标题“vc++获得网卡MAC地址源代码”中,我们可以推断这是一个使用Visual C++实现的...

    获取硬盘序列号,MAC地址

    在Windows操作系统中,获取硬盘序列号和MAC地址是常见的需求,尤其在软件授权、系统管理等领域。本项目提供的`SerialNumberMac.cpp`和`SerialNumberMac.h`文件旨在提供一个跨平台(支持win10、win7、xp)的解决方案...

Global site tag (gtag.js) - Google Analytics