Windows C++ 实现Windows服务程序

demo下载地址:https://download.csdn.net/download/2403_83063732/88987173
1、全局变量声明

#define SERVICENAME "TestService"//定义服务的名称
SERVICE_STATUS_HANDLE g_hServiceStatus = NULL;//当前服务的HANDLE
SERVICE_STATUS g_ServiceStatus = { 0 };//当前服务的状态数据
DWORD g_dwThreadID = 0;//线程ID用于关闭服务的时候使用
static FILE *g_logfp = NULL;//日志文件句柄

2、安装服务函数

//安装服务函数
BOOL Install()
{
    //检测是否安装过
    if (IsInstalled())
    {
        LogEvent("[%s] has IsInstalled\r\n", SERVICENAME);
        return TRUE;
    }

    //打开服务控制管理器  
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        LogEvent("Couldn't open service[%s] manager\r\n", SERVICENAME);
        return FALSE;
    }

    //获取程序目录
    TCHAR szFilePath[MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
    std::wstring wszPath ;
    wszPath = szFilePath;
    wszPath += L" /run";
    //创建服务  
    SC_HANDLE hService = ::CreateService(
        hSCM, 
        to_wide_string(SERVICENAME).c_str(), 
        to_wide_string(SERVICENAME).c_str(),
        SERVICE_ALL_ACCESS, 
        SERVICE_WIN32_OWN_PROCESS, 
        SERVICE_AUTO_START,自动启动方式
        SERVICE_ERROR_NORMAL,
        wszPath.c_str(),
        NULL, NULL,NULL, NULL, NULL);

    //检测创建是否成功
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        LogEvent("Couldn't create service[%s]\r\n", SERVICENAME);
        return FALSE;
    }
    LogEvent("[%s] CreateService Succ / Install Succ\r\n", SERVICENAME);
    //释放资源
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}
 

 3、启动服务函数

void StartDefService()
{
    SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (schSCManager == NULL)    return ;

    SC_HANDLE hService = OpenService(schSCManager, to_wide_string(SERVICENAME).c_str(), SERVICE_ALL_ACCESS);
    if (hService == NULL)        return ;

    // 开启服务
    ::StartService(hService, NULL, NULL);

    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(schSCManager);
}

4、实际服务程序运行以及运行函数

else if (_stricmp(argv[1], "/run") == 0)
    {
        GlobalDataInit();
        g_dwThreadID = ::GetCurrentThreadId();
        std::wstring wstrName = to_wide_string(SERVICENAME);
        LogEvent("[%s] run\r\n", SERVICENAME);
        SERVICE_TABLE_ENTRY st[] =
        {
            { (LPWSTR)(wstrName.c_str()), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
            { NULL, NULL }
        };

        if (!::StartServiceCtrlDispatcher(st))
        {
            LogEvent("Register Service Main Function Error! [%x]\r\n", GetLastError());
        }
    }

运行的主函数

//服务主函数,这在里进行控制对服务控制的注册
void WINAPI ServiceMain()
{
    //注册服务控制  
    g_hServiceStatus = RegisterServiceCtrlHandler(to_wide_string(SERVICENAME).c_str(), ServiceStrl);
    if (g_hServiceStatus == NULL)
    {
        LogEvent("Handler not installed\r\n");
        return;
    }
    g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    g_ServiceStatus.dwServiceSpecificExitCode = 0;
    ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);
    ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);
    //模拟服务的运行。应用时将主要任务放于此即可  
    //可在此写上服务需要执行的代码,一般为死循环  
    while (1)
    {
        SYSTEMTIME st;
        GetSystemTime(&st);
        LogEvent("%4d-%02d-%02d %02d:%02d:%02d Service Run\r\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

        Sleep(1000);
    }
    ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
}

 5、停止服务

// 停止服务
void StopDefService()
{
    SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (schSCManager == NULL)    return ;

    SC_HANDLE hService = OpenService(schSCManager, to_wide_string(SERVICENAME).c_str(), SERVICE_ALL_ACCESS);
    if (hService == NULL)        return ;

    SERVICE_STATUS status;
    // 停止服务
    ControlService(hService, SERVICE_CONTROL_STOP, &status);

    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(schSCManager);
}

6、卸载服务 

//删除服务函数
BOOL Uninstall()
{
    //检测是否安装过
    if (!IsInstalled())
    {
        LogEvent("[%s] has not Installed\r\n", SERVICENAME);
        return TRUE;
    }

    //打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        LogEvent("Couldn't open service[%s] manager\r\n", SERVICENAME);
        return FALSE;
    }

    //打开具体服务
    SC_HANDLE hService = ::OpenService(hSCM, to_wide_string(SERVICENAME).c_str(), SERVICE_STOP | DELETE);
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        LogEvent("Couldn't open service[%s]\r\n", SERVICENAME);
        return FALSE;
    }

    //先停止服务
    SERVICE_STATUS status;
    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);

    //删除服务  
    BOOL bDelete = ::DeleteService(hService);
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);

    if (bDelete)
    {
        LogEvent("Service deleted Succ[%s]\r\n", SERVICENAME);
        return TRUE;
    }
    LogEvent("Service could not be deleted\r\n");
    return FALSE;
}
 

7、测试方法

TestService.exe /install 安装服务

TestService.exe /start启动服务

TestService.exe /stop停止服务

TestService.exe /uninstall 卸载服务

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值