Windows Service服务程序的原理及实现(1)实现对服务的控制和管理

本文介绍了如何使用Windows服务管理API对服务进行控制和管理,包括创建服务、删除服务、启动服务、停止服务、向服务发送控制请求以及处理服务依赖。通过示例代码展示了如何实现这些功能。
摘要由CSDN通过智能技术生成

摘要:上一篇文章《Windows Service服务程序(0)服务主函数 & 控制处理函数》对Windows服务开发做了初步讲解。服务编写完成后,还需要服务管理程序才可以运行。一种方式是上篇文章中介绍的使用系统服务管理工具,如sc.exe等;另一种方式是使用Windows服务管理API自行编写服务管理程序。


目录:

本文介绍如何通过系统提供的API函数,对上一篇文章中开发的服务程序进行控制。

创建服务

向系统创建服务,创建时指定相应的服务属性,CreateService函数参数基本上从名称就能知道具体意思了,原型如下:

CreateServiceA(
    _In_        SC_HANDLE    hSCManager,                            //SCM句柄
    _In_        LPCSTR     lpServiceName,                           //服务名
    _In_opt_    LPCSTR     lpDisplayName,                           //显示的服务名
    _In_        DWORD        dwDesiredAccess,                       //存取权限
    _In_        DWORD        dwServiceType,                         //服务类别
    _In_        DWORD        dwStartType,                           //启动类别
    _In_        DWORD        dwErrorControl,                        //错误控制类别
    _In_opt_    LPCSTR     lpBinaryPathName,                        //服务的可执行文件路径
    _In_opt_    LPCSTR     lpLoadOrderGroup,                        //用户组
    _Out_opt_   LPDWORD      lpdwTagId,                             //标签
    _In_opt_    LPCSTR     lpDependencies,                          //服务独立性
    _In_opt_    LPCSTR     lpServiceStartName,                      //系统账户
    _In_opt_    LPCSTR     lpPassword                               //密码
    );

CreateService被宏定义为两套函数,分别为CreateServiceW和CreateServiceA,主要区别是前面为Unicode编码,后面为ASCII编码。以下直接使用CreateServiceA函数,一般不这么用,而用CreateService函数。

/*创建服务*/
int createService(SC_HANDLE schSCManager, LPSTR szPath, LPSTR szServiceName){
    SC_HANDLE schService = CreateServiceA(schSCManager, szServiceName, "demo_srv",
        SERVICE_ALL_ACCESS,         //存取权限
        SERVICE_WIN32_OWN_PROCESS,  //服务类别
        SERVICE_DEMAND_START,       //启动类型
        SERVICE_ERROR_NORMAL,       //错误控制类别
        szPath, NULL, NULL, NULL, NULL, NULL);

    if (schService == NULL){
        printf("Create service failed (%d).\n", GetLastError());
        return -1;
    }

    printf("Create service succeeded.\n");
    CloseServiceHandle(schService);
    schService = NULL;
    return 0;
}

删除服务

调用OpenService函数打开服务,获得服务句柄,然后使用DeleteService删除服务,该原型如下:

DeleteService(
    _In_        SC_HANDLE   hService
    );

删除服务是最简单的操作,可以封装成以下函数:

/*删除服务*/
int deleteService(SC_HANDLE schSCManager, LPSTR szServiceName){
    SC_HANDLE schService = OpenServiceA(schSCManager, szServiceName, DELETE);
    if (schService == NULL){
        printf("OpenService failed (%d).\n", GetLastError());
        return -1;
    }
    if (!DeleteService(schService)){
        printf("Delete service failed (%d).\n", GetLastError());
        return -2;
    }
    printf("Delete service succeeded.\n");
    CloseServiceHandle(schService);
    schService = NULL;
    return 0;
}

启动服务

启动服务StartService,有三个参数:服务的句柄,参数个数,参数列表指针。具体函数原型如下:

StartServiceA(
    _In_            SC_HANDLE            hService,                   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值