MFC系统服务开启停止代码

2024-06-14 23:18

本文主要是介绍MFC系统服务开启停止代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

// m_service.cpp : 实现文件
//


#include "stdafx.h"
#include "MFCApplication1.h"
#include "m_service.h"
#include "afxdialogex.h"




// m_service 对话框






m_service *m_this;
HANDLE hThread4;
SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
// m_service 对话框
DWORD WINAPI ThreadPro4(LPVOID lpThreadParameter)
{


CRect rt;
m_this->MyList.GetClientRect(rt);
m_this->MyList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_this->MyList.InsertColumn(0,_T("服务名"),0,rt.Width( ) / 3);
m_this->MyList.InsertColumn(1,_T("描述"),0,rt.Width( ) / 3);
m_this->MyList.InsertColumn(2,_T("服务状态"),0,rt.Width( ) / 3);


while(true)
{

m_this->MyList.DeleteAllItems( );
DWORD dwServiceNum = 0;
DWORD dwSize = 0;
EnumServicesStatusEx(hSCM,
SC_ENUM_PROCESS_INFO,
SERVICE_WIN32,
SERVICE_STATE_ALL,//所有服务状态
NULL,0,&dwSize,&dwServiceNum,
NULL,NULL);
//申请需要的内存 第二次调用
LPENUM_SERVICE_STATUS_PROCESS pEnumSerice = (LPENUM_SERVICE_STATUS_PROCESS)LocalAlloc(LPTR,dwSize);
//第二次枚举
BOOL bStattus = EnumServicesStatusEx(hSCM,SC_ENUM_PROCESS_INFO,SERVICE_WIN32,SERVICE_STATE_ALL,(PBYTE)pEnumSerice,dwSize,&dwSize,&dwServiceNum,NULL,NULL);
//遍历信息
for(DWORD i = 0; i < dwServiceNum; i++)
{
m_this->MyList.InsertItem(i,NULL);
m_this->MyList.SetItemText(i,0,pEnumSerice[i].lpServiceName);//服务名
m_this->MyList.SetItemText(i,1,pEnumSerice[i].lpDisplayName);//描述


if(pEnumSerice[i].ServiceStatusProcess.dwCurrentState == 1)
{
m_this->MyList.SetItemText(i,2,L"已停止");//服务类型
}
if(pEnumSerice[i].ServiceStatusProcess.dwCurrentState == 4)
{
m_this->MyList.SetItemText(i,2,L"正在运行");//服务类型
}


}
Sleep(5000);
}




return 0;
}








IMPLEMENT_DYNAMIC(m_service, CDialogEx)


m_service::m_service(CWnd* pParent /*=NULL*/)
: CDialogEx(m_service::IDD, pParent)
{


}


m_service::~m_service()
{
}


void m_service::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX,IDC_LIST1,MyList);
}




BEGIN_MESSAGE_MAP(m_service, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1,&m_service::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2,&m_service::OnBnClickedButton2)
END_MESSAGE_MAP( )




// m_service 消息处理程序




BOOL m_service::OnInitDialog( )
{
CDialogEx::OnInitDialog( );


// TODO:  在此添加额外的初始化






  CRect rc;
  ::GetClientRect(AfxGetApp( )->m_pMainWnd->m_hWnd,rc);
  rc.DeflateRect(0,15,40,90);



m_this = this;
  hThread4 = CreateThread(NULL,NULL,ThreadPro4,(LPVOID)1,NULL,NULL);




return TRUE;  // return TRUE unless you set the focus to a control
// 异常:  OCX 属性页应返回 FALSE
}


BOOL m_service::m_StartService(SC_HANDLE schSCManager,LPTSTR szServiceName)
{


SC_HANDLE schService;
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwOld;
DWORD dwStart;
DWORD dwWaitTime;
DWORD dwByteNeeded;
schService = OpenService(schSCManager,
szServiceName,//服务名字
SERVICE_ALL_ACCESS);//打开服务
if(schService == NULL)
{
return 0;
}
//开始启动服务
if(!StartService(schService,0,NULL))
{
MessageBox(L"启动失败");
return 0;
}
if(!QueryServiceStatusEx(schService,//服务的句柄
SC_STATUS_PROCESS_INFO,//服务状态的信息
(LPBYTE)&ssStatus,//结构体的变量地址
sizeof(SERVICE_STATUS_PROCESS),//结构体的大小
&dwByteNeeded))//储存信息要用的大小
{
//打开失败
return 0;
}
dwStart = GetTickCount( );//毫秒数
dwOld = ssStatus.dwCheckPoint;
while(ssStatus.dwCurrentState == SERVICE_START_PENDING)//判断当前状态
{
dwWaitTime = ssStatus.dwWaitHint / 10;//判断等待时间
if(dwWaitTime < 1000)
{
dwWaitTime = 1000;
}
else if(dwWaitTime > 10000)
{
dwWaitTime = 10000;
}
Sleep(dwWaitTime);
if(!QueryServiceStatusEx(schService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssStatus,sizeof(SERVICE_STATUS_PROCESS),&dwByteNeeded))//假设服务没有
{
//报告进展的情况,再次查询
break;
}
if(ssStatus.dwCheckPoint > dwOld)//当报告的时间大于所规定的时间
{
dwStart = GetTickCount( );
dwOld = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount( ) - dwStart > ssStatus.dwWaitHint)//如果启动时间大于等待时间,失败(时间到)
{
break;
}
}
}
CloseServiceHandle(schService);
if(ssStatus.dwCurrentState == SERVICE_RUNNING)//判断状态
{
MessageBox(L"启动成功");
return -1;
}
else
{
MessageBox(L"启动失败");
return 0;
}




}


DWORD m_service::m_StopService(SC_HANDLE hSCM,LPTSTR szServiceName,BOOL fStop,DWORD dwTimeout)
{


SERVICE_STATUS_PROCESS ssp;
SERVICE_STATUS ss;
DWORD dwStartTime = GetTickCount( );
DWORD dwBytesNeeded;
SC_HANDLE hService = OpenService(hSCM,szServiceName,SERVICE_ALL_ACCESS);
if(!QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssp,sizeof(SERVICE_STATUS_PROCESS),&dwBytesNeeded))
{
//判断是否停止
return GetLastError( );
}
if(ssp.dwCurrentState == SERVICE_STOP_PENDING)//如果是停止状态,只需等待
{
Sleep(ssp.dwWaitHint);
//循环查询状态的改变
if(!QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssp,sizeof(SERVICE_STATUS_PROCESS),&dwBytesNeeded))
{
return GetLastError( );
}
if(ssp.dwCurrentState == SERVICE_STOP)
{
MessageBox(L"停止成功");
return ERROR_SUCCESS;
}
if(GetTickCount( ) - dwStartTime > dwTimeout)
{
return ERROR_TIMEOUT;
}
}
if(fStop)
{
//先结束依赖的服务
DWORD dwBytesNeeded;
DWORD dwCount;
LPENUM_SERVICE_STATUS lpDependcies = NULL;
ENUM_SERVICE_STATUS ess;
SC_HANDLE hDepService;
//使用0大小的buf,获取Buf的大小
if(!EnumDependentServices(hService,SERVICE_ACTIVE,lpDependcies,0,&dwBytesNeeded,&dwCount))
{
if(GetLastError( ) != ERROR_MORE_DATA)
{
//返回成功,说明没有依赖服务
return  GetLastError( );
}
lpDependcies = (LPENUM_SERVICE_STATUS)HeapAlloc(GetProcessHeap( ),HEAP_ZERO_MEMORY,dwBytesNeeded);
//查看依赖服务的数据
if(!lpDependcies)
{
return GetLastError( );
}
_try{
//获得依赖服务
if(!EnumDependentServices(hService,SERVICE_ACTIVE,lpDependcies,dwBytesNeeded,&dwBytesNeeded,&dwCount))
{
return GetLastError( );
}
for(int i = 0; i < dwCount; i++)
{
ess = *(lpDependcies + i);
//打开服务
hDepService = OpenService(hSCM,ess.lpServiceName,SERVICE_STOP | SERVICE_QUERY_STATUS);
if(!hDepService)
{
return GetLastError( );
}
_try
{
//结束服务
if(!ControlService(hDepService,SERVICE_CONTROL_STOP,&ss))
{
return GetLastError( );
}
//等待服务结束
while(ss.dwCurrentState != SERVICE_STOPPED)
{
Sleep(ss.dwWaitHint);
if(!QueryServiceStatusEx(hDepService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssp,sizeof(SERVICE_STATUS_PROCESS),&dwBytesNeeded))
{
return GetLastError( );
}
if(ss.dwCurrentState == SERVICE_STOPPED)
{
break;
}
if(GetTickCount( ) - dwStartTime > dwTimeout)
{
return ERROR_TIMEOUT;
}
}
}
_finally
{
//关闭服务
CloseServiceHandle(hDepService);
}
}
}
_finally
{
//释放内存
HeapFree(GetProcessHeap( ),0,lpDependcies);
}
}
}
//所有的依赖服务已经关闭,结束指定服务
if(!ControlService(hService,SERVICE_STOPPED,&ss))
{
return GetLastError( );
}
while(ss.dwCurrentState != SERVICE_STOPPED)
{
Sleep(ss.dwWaitHint);
if(!QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,(LPBYTE)&ssp,sizeof(SERVICE_STATUS_PROCESS),&dwBytesNeeded))
{
return GetLastError( );
}
if(ss.dwCurrentState == SERVICE_STOPPED)
{
break;
}
if(GetTickCount( ) - dwStartTime > dwTimeout)
{
return ERROR_TIMEOUT;
}
}


return ERROR_SUCCESS;






}


//启动
void m_service::OnBnClickedButton1( )
{
// TODO:  在此添加控件通知处理程序代码
CString str1;
int nId;
//首先得到点击的位置
POSITION pos = MyList.GetFirstSelectedItemPosition( );
//得到行号,通过POSITION转化
nId = (int)MyList.GetNextSelectedItem(pos);
//得到列中的内容(0表示第一列,同理1,2,3...表示第二,三,四...列)
str1 = MyList.GetItemText(nId,0);
m_StartService(hSCM,(LPTSTR)(LPCTSTR)str1);//启动服务




}


//停止
void m_service::OnBnClickedButton2( )
{
// TODO:  在此添加控件通知处理程序代码
CString str1;
int nId;
//首先得到点击的位置
POSITION pos = MyList.GetFirstSelectedItemPosition( );
//得到行号,通过POSITION转化
nId = (int)MyList.GetNextSelectedItem(pos);
//得到列中的内容(0表示第一列,同理1,2,3...表示第二,三,四...列)
str1 = MyList.GetItemText(nId,0);
m_StopService(hSCM,(LPTSTR)(LPCTSTR)str1,TRUE,1000);
}



这篇关于MFC系统服务开启停止代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061778

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境