window完整服务程序

本文主要介绍了Windows系统的服务控制程序和服务端程序。首先,详细阐述了如何管理和操作Windows服务,包括启动、停止和配置等控制程序。接着,讨论了Windows服务端程序的实现原理和应用场景,为读者提供了一个深入理解Windows服务的基础。
摘要由CSDN通过智能技术生成

windows服务控制程序

#include <iostream>
#include <Windows.h>
BOOL DeleteSampleService(SC_HANDLE scSCManager, LPCWSTR szNameOfService);
DWORD StopService(SC_HANDLE scSCManager, LPCWSTR ServiceName, BOOL fStopDependencies, DWORD dwTimeout);

/******************************
* 功能:创建服务
* 参数: scSCManager, SC句柄
        szPath     ,  服务程序路径
        LPTSTR     ,  服务名
******************************/
BOOL CreateSampleService(SC_HANDLE scSCManager, LPCWSTR szPath, LPCWSTR szServiceName) {
   
    SC_HANDLE schService = CreateService(
        scSCManager,                //SCM句柄
        szServiceName,              //服务名
        TEXT("aaaaaaaa"),  //显示的服务名
        SERVICE_ALL_ACCESS,         //存储权限
        SERVICE_WIN32_OWN_PROCESS,  //服务类别
        SERVICE_DEMAND_START,       //启动类别            
        SERVICE_ERROR_NORMAL,       //错误控制类型
        szPath,                     //服务的可执行文件路径
        NULL,
        NULL,
        NULL,
        NULL,
        NULL
    );
        if (schService == NULL) {
   
            printf("'createService failed %d \n", GetLastError());
            if (GetLastError() == ERROR_SERVICE_EXISTS) {
   
                StopService(scSCManager, szServiceName, TRUE, 100);
                DeleteSampleService(scSCManager, szServiceName);
                CreateSampleService(scSCManager, szPath, szServiceName);
            }
            else {
   
                return FALSE;
            }
           
        }
        
        else {
   
            printf("createService succeed\n");
           

        }
        CloseServiceHandle(schService);
        return TRUE;

}

/**************************************
* 功能:删除服务
* 参数  SC_HANDLE scSCManager   SCM句柄
        LPCWSTR szNameofService 服务名
**************************************/

BOOL DeleteSampleService(SC_HANDLE scSCManager, LPCWSTR szNameOfService) {
   

    SC_HANDLE schService = OpenService(scSCManager, szNameOfService, DELETE);
    if (schService == NULL) {
   
        printf("'DeleteService failed %d \n", GetLastError());
        return FALSE;
    }
    else {
   
        if (!DeleteService(schService)) {
   
            printf("'DeleteService succeed \n");
        }
        

    }

    CloseServiceHandle(schService);
    return TRUE;
}


/***************************************
* 功能:启动服务
* 参数:SC_HANDLE scSCManager   SCM句柄
        LPCWSTR szNameofService 服务名
***************************************/
BOOL StartSampleService(SC_HANDLE scSCManager, LPCWSTR szNameofService) {
   
    SC_HANDLE schService;
    SERVICE_STATUS_PROCESS ssStatus;
    DWORD dwOldCheckPoint;
    DWORD dwStartTickCount;
    DWORD dwWaitTime;
    DWORD dwBytesNeeded;
    //打开服务
    schService = OpenService(scSCManager, szNameofService, SERVICE_ALL_ACCESS);
    if (schService == NULL) {
   
        printf("OpenService failed %d \n", GetLastError);
        return FALSE;
    }
    if (!StartService(
        schService,
        0,                 //参数个数
        NULL              //参数指针         
    )) {
   
        printf("Service Start error(%u) \n", GetLastError());
        return FALSE;
    }
    //SC_STATUS_TYPE
    //状态验证
    if (!QueryServiceStatusEx(
        schService,
        SC_STATUS_PROCESS_INFO,         //服务状态信息
        (LPBYTE)&ssStatus,              //结构体地址
        sizeof(SERVICE_STATUS_PROCESS), //结构体大小
        &dwBytesNeeded                  //接收存储所有状态信息所需的字节数    
        )) {
   
        printf("QueryServiceStatus failed %d\n", GetLastError());
        return FALSE;
    }
    dwStartTickCount = GetTickCount();
    dwOldCheckPoint = ssStatus.dwCheckPoint;
    while (ssStatus.dwCurrentState == SERVICE_START_PENDING) {
   
        //等待一段时间后再查询
        dwWaitTime = ssStatus.dwWaitHint / 10;
        if (dwWaitTime !=1000) {
   
            dwWaitTime = 1000;
        }
        Sleep(dwWaitTime);

        //再次查询
        if (!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值