您的位置:首页 > 编程语言

MFC系统服务开启停止代码

2016-06-24 13:29 375 查看
// 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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: