Code
//MyServiceStatus.cpp:implementationoftheCMyServiceStatusclass.
//
/**///////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include<process.h>
#include"MyServiceStatus.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
/**///////////////////////////////////////////////////////////////////////
//Construction/Destruction
/**///////////////////////////////////////////////////////////////////////
CMyServiceStatus::CMyServiceStatus(LPTSTRszServiceName)
{
m_szServiceName=szServiceName;
m_bIsServiceInstalled=FALSE;
m_bNeedExit=FALSE;
m_dwServiceStatus=0xFFFFFFFF;
hSCM=NULL;
hService=NULL;
m_hThreadOverEvent=CreateEvent(NULL,TRUE,FALSE,NULL);//初始化线程结束信号,并指定手动复位
if(hSCM==NULL)
hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
}
CMyServiceStatus::~CMyServiceStatus()
{
if(hService)
CloseServiceHandle(hService);
if(hSCM!=NULL)
CloseServiceHandle(hSCM);
}
BOOLCMyServiceStatus::IsServiceInstalled()
{
returnm_bIsServiceInstalled;
}
//重载
BOOLCMyServiceStatus::IsServiceInstalled(LPCTSTRszServiceName)
{
BOOLbResult=FALSE;
SC_HANDLEmHService;
if(hSCM!=NULL)
{
mHService=::OpenService(hSCM,szServiceName,SERVICE_QUERY_CONFIG);
if(mHService!=NULL)
{
bResult=TRUE;
::CloseServiceHandle(mHService);
}
}
returnbResult;
}
BOOLCMyServiceStatus::Run()
{
UINTdwThreadId;
HANDLEhThread;
m_bNeedExit=FALSE;
hThread=(HANDLE)_beginthreadex(NULL,0,GetServiceStatus,(void*)this,0,&dwThreadId);
if(hThread!=NULL)
{
CloseHandle(hThread);
returnTRUE;
}
returnFALSE;
}
unsignedint__stdcallCMyServiceStatus::GetServiceStatus(LPVOIDlParam)
{
CMyServiceStatus*pThis=reinterpret_cast<CMyServiceStatus*>(lParam);
DWORDdwState=0xFFFFFFFF;
DWORDdwErr=0xFFFFFFFF;
while(!pThis->m_bNeedExit)
{
DWORDdResult=WaitForSingleObject(pThis->m_hThreadOverEvent,100);
if(dResult==WAIT_OBJECT_0)
break;
if(pThis->hService){
//Getthecurrentstatus
SERVICE_STATUSss;
memset(&ss,0,sizeof(ss));
BOOLb=QueryServiceStatus(pThis->hService,
&ss);
if(!b){
DWORDdwErr=GetLastError();
ASSERT(0);
}else{
dwErr=ss.dwWin32ExitCode;
dwState=ss.dwCurrentState;
//Iftheserviceisrunning,sendacontrolrequest
//togetitscurrentstatus
if(dwState==SERVICE_RUNNING){
b=::ControlService(pThis->hService,
SERVICE_CONTROL_INTERROGATE,
//Notifiesaservicethat
//itshouldreportitscurrent
//statusinformationtothe
//servicecontrolmanager.
&ss);
if(b){
dwErr=ss.dwWin32ExitCode;
dwState=ss.dwCurrentState;
}
}
}//endelse
pThis->m_dwServiceStatus=dwState;
}//endif
else
{
pThis->MyOpenService();
}
}
}
voidCMyServiceStatus::MyOpenService()
{
m_bIsServiceInstalled=FALSE;
m_dwServiceStatus=0xFFFFFFFF;
if(_tcslen(m_szServiceName)<1)
return;
HKEYhkey;
charszKey[1024];
strcpy(szKey,"SYSTEM\\CurrentControlSet\\Services\\");
strcat(szKey,m_szServiceName);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szKey,
0,
KEY_QUERY_VALUE,
&hkey)==ERROR_SUCCESS){
//Yesweareinstalled
m_bIsServiceInstalled=TRUE;
intm_iStartParam;
intm_iIncParam;
DWORDdwType=0;
DWORDdwSize=sizeof(m_iStartParam);
RegQueryValueEx(hkey,
"Start",
NULL,
&dwType,
(BYTE*)&m_iStartParam,
&dwSize);
dwSize=sizeof(m_iIncParam);
RegQueryValueEx(hkey,
"Inc",
NULL,
&dwType,
(BYTE*)&m_iIncParam,
&dwSize);
RegCloseKey(hkey);
}
else
return;
if(hSCM!=NULL)
{
//opentheservice
hService=OpenService(hSCM,m_szServiceName,SERVICE_ALL_ACCESS);
}
}
voidCMyServiceStatus::Stop()
{
m_bNeedExit=TRUE;
SetEvent(m_hThreadOverEvent);
}
voidCMyServiceStatus::MyStartService()
{
if(hService&&m_dwServiceStatus==SERVICE_STOPPED)
{
StartService(hService,0,NULL);
}
}
voidCMyServiceStatus::MyStopService()
{
if(hService&&m_dwServiceStatus==SERVICE_RUNNING)
{
SERVICE_STATUSss;
BOOLb=ControlService(hService,
SERVICE_CONTROL_STOP,
&ss);
}
}
BOOLCMyServiceStatus::Install(LPCTSTRszServiceName,LPCTSTRszFilePath)
{
BOOLbResult=FALSE;
if(IsServiceInstalled(szServiceName))
returnTRUE;
SC_HANDLEmHService;
if(hSCM!=NULL)
{
mHService=::CreateService(
hSCM,szServiceName,szServiceName,
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
szFilePath,NULL,NULL,_T("RPCSS\0"),NULL,NULL);
if(mHService!=NULL)
{
bResult=TRUE;
::CloseServiceHandle(mHService);
}
}
returnbResult;
}
BOOLCMyServiceStatus::UnInstall(LPCTSTRszServiceName)
{
BOOLbResult=FALSE;
if(!IsServiceInstalled(szServiceName))
returnTRUE;
SC_HANDLEmHService;
if(hSCM!=NULL)
{
mHService=::OpenService(hSCM,szServiceName,SERVICE_STOP|DELETE);
if(mHService!=NULL)
{
SERVICE_STATUSstatus;
::ControlService(mHService,SERVICE_CONTROL_STOP,&status);
bResult=::DeleteService(hService);
}
}
returnbResult;
}
使用示例:
...
#include "MyServiceStatus.h"
class CNTServCtrlDlg : public CDialog
{
...
private:
CMyServiceStatus m_MyServiceStatus;
}
////////////////////////////////////////////////////////////
CNTServCtrlDlg::CNTServCtrlDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNTServCtrlDlg::IDD, pParent),m_MyServiceStatus("FileSync")
{
//{{AFX_DATA_INIT(CNTServCtrlDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_uiTimer = 0;
}
BOOL CNTServCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CenterWindow();
m_MyServiceStatus.Run();//启动查询状态线程
return TRUE; // return TRUE unless you set the focus to a control
}
void CNTServCtrlDlg::OnTimer(UINT nIDEvent)
{
// Update the status
ShowState();
}
void CNTServCtrlDlg::ShowState()
{
DWORD dwState = 0xFFFFFFFF;
char buf[64];
dwState = m_MyServiceStatus.m_dwServiceStatus;
switch (dwState) {
case SERVICE_STOPPED:
strcpy(buf, "Stopped");
break;
case SERVICE_START_PENDING:
strcpy(buf, "Start pending");
break;
case SERVICE_STOP_PENDING:
strcpy(buf, "Stop pending");
break;
case SERVICE_RUNNING:
strcpy(buf, "Running");
break;
case SERVICE_CONTINUE_PENDING:
strcpy(buf, "Continue pending");
break;
case SERVICE_PAUSE_PENDING:
strcpy(buf, "Pause pending");
break;
case SERVICE_PAUSED:
strcpy(buf, "Paused");
break;
default:
if(!m_MyServiceStatus.IsServiceInstalled())
strcpy(buf,"Service Not Installed");
else
strcpy(buf, "<Unknown>");
break;
}
SetDlgItemText(IDC_STATE, buf);
}
void CNTServCtrlDlg::OnDestroy()
{
m_MyServiceStatus.Stop();//结束CMyServiceStatus中的查询状态线程
CDialog::OnDestroy();
if (m_uiTimer != 0) {
KillTimer(1);
}
}
优质内容筛选与推荐>>
1、leetcode5982、Oracle 执行长SQL3、mysql5.7.24免安装版配置及密码初始化及mysql-font连接异常4、J2SE知识点摘记(十五)5、HDOJ-2036