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

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Windows 可变刷新率是什么?如何开启?

在现代计算设备中,显示屏的刷新率对用户体验起着至关重要的作用。随着显示技术的不断进步,固定刷新率显示器逐渐被支持可变刷新率(Variable Refresh Rate, VRR)技术的显示器所取代。 可变刷新率定义 可变刷新率是什么?可变刷新率(VRR)是一种显示技术,它允许显示器的刷新率动态调整,以匹配显卡输出的帧率。传统的显示器通常具有固定的刷新率(如60Hz、75Hz等),这意味着显示器