1.操作服务类的头文件WindowsService.h:

#pragma once
 
class CWindowsService
{
public:
 CWindowsService(void);
public:
 ~CWindowsService(void);
 enum SEV_STATUS
 {
  SEV_ERROR = 0x00,
  SEV_NO  = 0x01,
  SEV_HAVE = 0x02,
  SEV_RUNING = 0x03,
  SEV_STOPED = 0x04
 };
public:
 BOOL AddService(const char*pSourceName,const char*pServiceName,const char*pDisName,const char*pPara);
 BOOL RemoveService(const char*pServiceName);
 BYTE CheckServiceStatus(const char*pServiceName);
 BOOL StartSevice(const char*pServiceName);
 BOOL StopSevice(const char*pServiceName);
 BOOL GetSevicePath(const char*pServiceName,CString &strServicePath);
 BOOL GetCurPath(CString &strCurPath);
};

2.操作服务类的执行文件WindowsService.cpp:

/********************************************************************************** 
windows 服务操作类 
write by fjssharpsword
2010-12-23
************************************************************************************/  
#include "StdAfx.h"   
#include "WindowsService.h"   
#include "winsvc.h"   
  
CWindowsService::CWindowsService(void)  
{  
}  
  
CWindowsService::~CWindowsService(void)  
{  
}

/***************************************************** 
创建服务说明 
如 m_Test.AddService("C://Test//Test.exe","MyServiceName","DisplayName",NULL); 
pPara 为参数有些服务需
*****************************************************/ 
  
BOOL CWindowsService::AddService(const char*pSourceName,const char*pServiceName,const char*pDisName,const char*pPara)  
{  
    SC_HANDLE hSC = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE );  
    if ( hSC == NULL )  
    {  
        return FALSE;//_ERROR_;   
    }  
    CString strBinnaryPathName;  
    strBinnaryPathName.Format("%s%s%s %s","/"",pSourceName,"/"",pPara);  
  
    SC_HANDLE hSvc = CreateService( hSC,  
                              pServiceName,       //服务名称   
                                    pDisName,          //显示名称   
                                    SERVICE_ALL_ACCESS,  
                                    SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,  
                                    SERVICE_AUTO_START,  
                                    SERVICE_ERROR_NORMAL,  
                                    strBinnaryPathName,   
                                    NULL,  
                                    NULL,  
                                    NULL,  
                                    NULL,  
                                    NULL );  
    if( hSvc == NULL )  
 {  
        ::CloseServiceHandle( hSC );  
        return FALSE;//_ERROR_;   
    }  
    ::CloseServiceHandle( hSvc );  
    ::CloseServiceHandle( hSC );  
    return TRUE;  
}  
  
  
/* 
************************************************** 
删除服务 
************************************************** 
*/  
BOOL CWindowsService::RemoveService(const char*pServiceName)  
{  
    // UnInstall the XService from Service Control Manager Database   
    SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, SC_MANAGER_ALL_ACCESS);  
    if( hSC == NULL)  
    {  
        return FALSE;  
    }  
  
    SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_STOP | DELETE/*SERVICE_ALL_ACCESS*/);   
    if( hSvc == NULL)  
    {  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }

SERVICE_STATUS status;  
    ::ControlService(hSvc, SERVICE_CONTROL_STOP, &status);  
       
    if ( !::DeleteService(hSvc))
 {
  DWORD _error =GetLastError();//ERROR_ACCESS_DENIED
  return FALSE;
 }

::CloseServiceHandle(hSvc);
 ::CloseServiceHandle(hSC);
 return TRUE; 
}  
  
/* 
************************************************** 
检测状态 
************************************************** 
*/  
BYTE CWindowsService::CheckServiceStatus(const char*pServiceName)  
{  
    SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);  
    if( hSC == NULL)  
    {  
        return SEV_ERROR;  
    }  
    // 打开服务。   
    SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);  
    if( hSvc == NULL)  
    {  
        ::CloseServiceHandle( hSC);  
        return SEV_NO;  
    }  
    // 获得服务的状态   
    SERVICE_STATUS status;  
    if( ::QueryServiceStatus( hSvc, &status) == FALSE)  
    {  
       // TRACE( "Get Service state error。");   
        ::CloseServiceHandle( hSvc);  
        ::CloseServiceHandle( hSC);  
        return SEV_ERROR;  
    }  
    if(status.dwCurrentState == SERVICE_RUNNING)  
    {  
        ::CloseServiceHandle( hSvc);  
        ::CloseServiceHandle( hSC);  
        return SEV_RUNING;  
    }  
    else if(status.dwCurrentState == SERVICE_STOPPED)  
    {  
        ::CloseServiceHandle( hSvc);  
        ::CloseServiceHandle( hSC);  
        return SEV_STOPED;  
    }  
    ::CloseServiceHandle( hSvc);  
    ::CloseServiceHandle( hSC);  
    return SEV_ERROR;  
}  
/* 
************************************************** 
启动服务 
************************************************** 
*/  
BOOL CWindowsService::StartSevice(const char*pServiceName)  
{  
    SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);  
    if( hSC == NULL)  
    {  
        return FALSE;  
    }  
    // 打开服务。   
    SC_HANDLE hSvc = ::OpenService( hSC, pServiceName, SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);  
    if( hSvc == NULL)  
    {  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }  
    // 获得服务的状态   
    SERVICE_STATUS status;  
    if( ::QueryServiceStatus( hSvc, &status) == FALSE)  
    {  
        //TRACE( "Get Service state error。");   
        ::CloseServiceHandle( hSvc);  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }
 
 if( status.dwCurrentState != SERVICE_RUNNING) //如果处于停止状态则启动服务,否则返回     
    {
  // 启动服务
  if( ::StartService( hSvc, NULL, NULL) == FALSE)
  {
   //TRACE( "start service error。");
   ::CloseServiceHandle( hSvc);  
            ::CloseServiceHandle( hSC);  
            return FALSE;  
        }  
        // 等待服务启动   
        while( ::QueryServiceStatus( hSvc, &status) == TRUE)  
        {  
            ::Sleep(500);  
            QueryServiceStatus( hSvc, &status);  
            if( status.dwCurrentState == SERVICE_START_PENDING)  
            {  
                //AfxMessageBox( "start success。");   
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return TRUE;  
            }  
            ::Sleep( status.dwWaitHint);  
            QueryServiceStatus( hSvc, &status);  
            if( status.dwCurrentState == SERVICE_RUNNING)  
            {  
                //AfxMessageBox( "start success。");   
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return TRUE;  
            }  
            else  
            {  
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return FALSE;  
            }
  }
 }  
    ::CloseServiceHandle( hSvc);  
    ::CloseServiceHandle( hSC);  
    return TRUE;  
}  
/* 
************************************************** 
停止服务 
************************************************** 
*/  
BOOL CWindowsService::StopSevice(const char*pServiceName)  
{  
    SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE);  
    if( hSC == NULL)  
    {  
        return FALSE;  
    }  
    // 打开服务。   
    SC_HANDLE hSvc = ::OpenService( hSC, pServiceName,  
        SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);  
    if( hSvc == NULL)  
    {  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }  
    // 获得服务的状态   
    SERVICE_STATUS status;  
    if( ::QueryServiceStatus( hSvc, &status) == FALSE)  
    {  
        //TRACE( "Get Service state error。");   
        ::CloseServiceHandle( hSvc);  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }  
      //如果处于停止状态则启动服务,否则停止服务。   
    if( status.dwCurrentState == SERVICE_RUNNING)  
    {  
        // 停止服务   
        if( ::ControlService( hSvc, SERVICE_CONTROL_STOP, &status) == FALSE)  
        {  
            //TRACE( "stop service error。");   
            ::CloseServiceHandle( hSvc);  
            ::CloseServiceHandle( hSC);  
            return FALSE;  
        }  
        // 等待服务停止   
        while( ::QueryServiceStatus( hSvc, &status) == TRUE)  
        {  
             //::Sleep( status.dwWaitHint);   
            ::Sleep(1000);  
            QueryServiceStatus( hSvc, &status);  
            if( status.dwCurrentState == SERVICE_STOPPED)  
            {  
               //AfxMessageBox( "stop success。");   
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return TRUE;  
            }  
            ::Sleep(3000);  
            QueryServiceStatus( hSvc, &status);  
            if( status.dwCurrentState == SERVICE_STOPPED)  
            {  
               //AfxMessageBox( "stop success。");   
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return TRUE;  
            }  
            ::Sleep( status.dwWaitHint);  
            QueryServiceStatus( hSvc, &status);  
            if( status.dwCurrentState == SERVICE_STOPPED)  
            {  
               //AfxMessageBox( "stop success。");   
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return TRUE;  
            }  
            else  
            {  
                ::CloseServiceHandle( hSvc);  
                ::CloseServiceHandle( hSC);  
                return FALSE;  
            }  
        }  
    }  
    return TRUE;  
}  
  
  
  
  
  
BOOL CWindowsService::GetSevicePath(const char*pServiceName,CString & strServicePath)  
{   
    SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, SC_MANAGER_ALL_ACCESS);  
    if( hSC == NULL)  
    {  
        return FALSE;  
    }  
    // 打开服务。   
    SC_HANDLE hSvc = ::OpenService( hSC, pServiceName,SERVICE_ALL_ACCESS);  
    if( hSvc == NULL)  
    {  
        ::CloseServiceHandle( hSC);  
        return FALSE;  
    }  
    LPQUERY_SERVICE_CONFIG  pServiceConfig;  
    DWORD   cbBufSize = 1024*8;//sizeof(SERVICE_DESCRIPTION_STRUCT);   
      
    DWORD   cbBytesNeeded;  
    CString strPath;  
    pServiceConfig = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, cbBufSize);      //注意分配足够的空间    
    QueryServiceConfig( hSvc, pServiceConfig  ,cbBufSize, &cbBytesNeeded);   
    strPath = pServiceConfig->lpBinaryPathName;  
    strPath.Replace('"',' ');  
    //int iFind = strPath.Find("");   
    //strPath = strPath.Left(iFind+1);   
    int iFind = strPath.Find("exe");  
    strPath = strPath.Left(iFind+3);  
    strServicePath = strPath;  
    ::LocalFree(pServiceConfig);  
    ::CloseServiceHandle( hSvc);  
    ::CloseServiceHandle( hSC);  
      
    return TRUE;  
}  
  
  
BOOL CWindowsService::GetCurPath(CString &strCurPath)  
{  
    char szTemp[MAX_PATH] = {0};  
    ::GetModuleFileName(NULL, szTemp, sizeof(szTemp)-1);  
    int iLen = (int)strlen(szTemp);  
    for(int i = iLen - 1; i >= 0; i--)  
    {  
        if (szTemp[i] == '//')  
        {  
            break;  
        }  
        else  
        {  
            szTemp[i] = 0;  
        }  
    }  
    strCurPath = szTemp;  
    return TRUE;  
}  
3.调用案例:

#include "WindowsService.h"
void CDemoSvrDlg::OnOK()
{
 // TODO: Add extra validation here 
 CWindowsService ws;
 ws.AddService("D://demo.exe","demo","demo",NULL);//创建

ws.StartSevice("demo");//启动

if(ws.CheckServiceStatus("demo") == 0x03)
  AfxMessageBox("启动状态");

ws.StopSevice("demo");

if(ws.CheckServiceStatus("demo") == 0x04)
  AfxMessageBox("停止状态");

ws.RemoveService("demo");//删除
 //CDialog::OnOK();
}

vc操作windows服务(services.msc)相关推荐

  1. Windows系统 services.msc命令详解,Windows命令行查看本地服务

    「作者主页」:士别三日wyx 第一步.打开cmd 按下 win 键,输入 cmd 后回车,打开「命令提示符」 第二步.查看系统版本 在打开的cmd窗口中,输入 services.msc 后回车,即可在 ...

  2. 如何打开windows的服务services.msc

    两种开启方式:services.msc 方法一:点击win+r回车,而后输入services.msc 回车就OK了. 方法二:手动开启:开始-运行,而后输入services.msc 回车就OK了. 转 ...

  3. C#开发人员能够可视化操作windows服务

    使用C#开发自己的定义windows服务是一个很简单的事.因此,当.我们需要发展自己windows它的服务.这是当我们需要有定期的计算机或运行某些程序的时候,我们开发.在这里,我有WCF监听案例,因为 ...

  4. VC++ 创建Windows服务

    我在开发的时候用到了DLL里面的函数,开始的时候采用的静态导入的方法,但是发现服务开机启动以后就死掉了,这里不是DLL路径的问题. 没办法,自己只得用动态导入的方法,还好,服务自动开机运行了,还算正常 ...

  5. VC++的windows服务

    项目建立: VS2008->ATL项目->服务exe 服务部署: 在VS2008中新建的ATL项目,在网上看到的流程中都会有注册服务这一项. 但是对服务的注册都是只给了一个指令,一句话带过 ...

  6. VC制作 Windows服务 安装包

    C++跟.NET 不同,没有线程的安装程序类用来继承和操作 所以,一些自定义的东西,之好采用VBS脚本的方式来进行 以下转载:  http://hi.baidu.com/feng_hit/item/6 ...

  7. C# 创建Windows服务。服务功能:定时操作数据库

    一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...

  8. 规划以主机命名的网站集 (Windows SharePoint Services)

    摘自MSDN:http://technet.microsoft.com/zh-cn/library/cc288637.aspx Windows SharePoint Services 3.0 既支持以 ...

  9. Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)

    转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...

最新文章

  1. 怎么安装MYSQL5.0的JDBC驱动
  2. mysql alert on delete cascade_如何在mysql中删除级联使用?(How do I use on delete cascade in mysql?)...
  3. day09_读写分离_Atlas小记
  4. 190906描述笔记
  5. UVA12321 Gas Stations【贪心】
  6. 使用OpenSSL颁发CA证书
  7. 汇编语言工具(DosBox、debug)下载与安装教程
  8. 遥感式雷达监测水位流速设备
  9. php 公众号 欢迎,如何正确编写微信公众号欢迎语
  10. OpenStreetMap 2020年全球数据导入benchmark
  11. [ 树形DP ] BZOJ4987
  12. 基于JAVA基于Web的上门家教系统的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  13. 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
  14. pat甲级考试报名费_每日一感——记第一次PAT甲级考试之感想
  15. 【程序员入门记录】ThinkPad E470改造记录——换屏
  16. 计算机作文范文,未来计算机作文范文.docx
  17. Access denied for user 'mysql用户名'@'主机或IP' (using password: YES)'
  18. 树莓派3 之 USB摄像头安装和使用
  19. Java中的Supplier接口
  20. 如何将PDF转为Word使用?安利3个可以转换的软件

热门文章

  1. connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...
  2. Domain Model
  3. kafka shell
  4. CentOS-7.0.中安装与配置Tomcat-7的方法
  5. springboot profiles
  6. Struts(七):action配置文件之通配符映射
  7. hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)
  8. tomcat集群 (自带Cluster集群)
  9. iOS - UITableViewCell Custom Selection Style Color
  10. Linux之read命令使用