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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值