// ServiceHlpr.cpp: implementation of the ServiceHlpr class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ServiceHlpr.h"
#include <winsvc.h>
#pragma comment(lib,"advapi32.lib")
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ServiceHlpr::ServiceHlpr()
{
}
ServiceHlpr::~ServiceHlpr()
{
}
/*
1:SERVICE_STOPPED The service is not running.
2:SERVICE_START_PENDING The service is starting.
3:SERVICE_STOP_PENDING The service is stopping.
4:SERVICE_RUNNING The service is running.
5:SERVICE_CONTINUE_PENDING The service continue is pending.
6:SERVICE_PAUSE_PENDING The service pause is pending.
7:SERVICE_PAUSED The service is paused.
*/
DWORD ServiceHlpr::QueryStats(LPCTSTR pszName)
{
SC_HANDLE schSCManager = ::OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
if( schSCManager == NULL ) return 8;
SC_HANDLE schService = ::OpenService(schSCManager,pszName,SERVICE_QUERY_STATUS);
if(schService == NULL)
{
::CloseServiceHandle(schSCManager);
return 9;
}
SERVICE_STATUS ssStatus;
BOOL bRet = ::QueryServiceStatus(schService, &ssStatus);
::CloseServiceHandle(schService);
::CloseServiceHandle(schSCManager);
if(bRet) return ssStatus.dwCurrentState;
return 10;
}
//-- Ret 4==RUNNING:OK ---
DWORD ServiceHlpr::Start(LPCTSTR pszName)
{
if(QueryStats(pszName) == SERVICE_RUNNING) return 0;
SC_HANDLE schSCManager = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if( schSCManager == NULL ) return 8;
SC_HANDLE schService = ::OpenService(schSCManager,pszName,SERVICE_ALL_ACCESS);
if( schService== NULL )
{
::CloseServiceHandle(schSCManager);
return 9;
}
SERVICE_STATUS ssStatus;
BOOL bRet = ::StartService(schService, 0, 0);
if(bRet)
{
Sleep(1000);
while( ::QueryServiceStatus(schService, &ssStatus))
{
if(ssStatus.dwCurrentState == SERVICE_START_PENDING ) Sleep(1000);
else break;
}
if(ssStatus.dwCurrentState != SERVICE_RUNNING) bRet = FALSE;
}
::CloseServiceHandle(schService);
::CloseServiceHandle(schSCManager);
if(bRet) return ssStatus.dwCurrentState;
return 10;
}
//-- Ret 1==SERVICE_STOPPED:OK ---
DWORD ServiceHlpr::Stop(LPCTSTR pszName)
{
if(QueryStats(pszName) == SERVICE_STOPPED) return 0;
SC_HANDLE schSCManager = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if( schSCManager == NULL ) return 8;
SC_HANDLE schService = ::OpenService(schSCManager,pszName,SERVICE_ALL_ACCESS);
if( schService== NULL )
{
::CloseServiceHandle(schSCManager);
return 9;
}
SERVICE_STATUS ssStatus;
BOOL bRet = ControlService(schService,SERVICE_CONTROL_STOP,&ssStatus);
if(bRet)
{
if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
Sleep(1000);
while( ::QueryServiceStatus(schService, &ssStatus))
{
if(ssStatus.dwCurrentState == SERVICE_START_PENDING ) Sleep(1000);
else break;
}
}
if(ssStatus.dwCurrentState != SERVICE_STOPPED) bRet = FALSE;
}
::CloseServiceHandle(schService);
::CloseServiceHandle(schSCManager);
if(bRet) return ssStatus.dwCurrentState;
return 10;
}
DWORD ServiceHlpr::QueryPath(LPCTSTR pszName,LPTSTR pszPathName,DWORD nSize)
{
SC_HANDLE schSCManager = ::OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
if( schSCManager == NULL ) return 8;
SC_HANDLE schService = ::OpenService(schSCManager,pszName,SERVICE_QUERY_CONFIG);
if(schService == NULL)
{
::CloseServiceHandle(schSCManager);
return 9;
}
LPQUERY_SERVICE_CONFIG lpqsc= (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR,4096);
DWORD deByteNeed = 0;
BOOL bRet = ::QueryServiceConfig(schService, lpqsc,4096,&deByteNeed);
if(bRet) strcpy(pszPathName,lpqsc->lpBinaryPathName);
LocalFree(lpqsc);
::CloseServiceHandle(schService);
::CloseServiceHandle(schSCManager);
if(bRet) return 0;
return 10;
}
![avatar](https://profile-avatar.csdnimg.cn/66697480d9ad48fcad1e0e71e85020a7_ok1234567.jpg!1)
ok1234567
- 粉丝: 50
- 资源: 5
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)