Windows 编程之服务-1

这篇博客介绍了Windows服务的编程,包括编写服务程序的三个关键部分:入口函数、服务主函数和服务控制处理函数。详细阐述了如何注册服务主函数、设置控制处理函数以及如何使用API进行服务的创建、删除、启动和停止。最后提到了实践中使用Visual Studio 2012 C++编写服务应用的方法,并给出了服务控制和管理的命令行操作。
摘要由CSDN通过智能技术生成

一、 编写服务程序

一个服务程序至少包括一个入口函数、服务主函数和控制处理函数。

1. 入口函数

 入口函数是可执行程序执行的起点,服务程序的入口函数与一般的可执行程序的入口函数 没有区别。

2. 服务主函数

一个服务程序必须具有服务主函数,服务主函数 是服务启动时执行的入口,也是服务的主线程执行起点。 

① 服务主函数 ServiceMain 

服务主函数一般称作ServiceMain函数。其函数名称没有任何要求,只是起参数接口和调用类型必须与要求一致。

ServiceMain函数原型如下:

VOID WINAPI ServiceMain(

DWORD dwArgc,

LPTSTR *argv);

服务主函数的参数与 main 函数的参数使用方法类似,但是服务主函数的参数不是通过在命 

令行启动时设定的,而是通过 SCM 的相关 API 进行传递的(StartService 函数)。

② 向 SCM 注册服务的主函数 StartServiceCtrIDispatcher

SCM 要对服务进行管理,就必须知道服务程序的服务主函数。服务程序通过调用 StartServiceCtrlDispatcher API函数设置服务主函数,同时通知SCM。 

v StartServiceCtrlDispatcher 函数原型如下:

BOOL WINAPI StartServiceCtrlDispatcher(

    _In_ CONST  SERVICE_TABLE_ENTRYW    *lpServiceStartTable

    );

结构 SERVICE_TABLE_ENIRY 的原型如下: 

typedef struct _SERVICE_TABLE_ENTRYW {

    LPWSTR                      lpServiceName;

    LPSERVICE_MAIN_FUNCTIONW    lpServiceProc;

}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;

其中 lpServiceName 为服务名称,lpServiceProc 为指向 ServiceMain 的函数指针。只 要将函数的指针赋值给 lpServiceProc,再调用 StartServiceCtrlDispatcher,这个函数就 成为了服务主函数。

3. 控制处理函数

① 控制处理函数Handle

 控制处理函数用于处理SCM向服务传递的服务控制请求。控制处理函数Handler原型如下:

VOID WINAPI ServiceHandler(DWORD opcode);

② 注册控制管理函数

API 函数 RegisterServiceCtrlHandler 用于向 SCM 设置一个服务的控制处理函数。 

WINAPI

RegisterServiceCtrlHandlerW(

    _In_    LPCWSTR                         lpServiceName,

    _In_    __callback LPHANDLER_FUNCTION   lpHandlerProc

    );

 其中 lpServiceName 为服务名称,lpHandlerProc 为 Handler 函数指针。

二、 实现对服务的控制和管理

使用服 务管理 API 自行编写一个服务管理程序。服务管理程序为系统新建服务,负责启动停止服务 程序,并负责管理服务程序的属性等。 

1. 创建、删除服务

① OpenSCManager

WINAPI OpenSCManagerW(

    _In_opt_        LPCWSTR      lpMachineName,

    _In_opt_        LPCWSTR      lpDatabaseName,

    _In_            DWORD        dwDesiredAccess

    );

v 参数     

lpMachineName:输入参数,机器名,如果是本机则使用NULL。   

lpDatabaseName:输入参数,SCM 数据库名,设置为 NULL 或设置为 SERVICES ACTIVE DATABASE,效果等同。     

dwDesiredAccess:输入参数,需要的权限,可设置为 SC MANAGER ALL ACCESS、 SC_MANAGER_CREATE_SERVICESC_MANAGERCONNECT 等。     

v 返回值     

SC_HANDLE 类型,SCM 的句柄。

② CreateService

向系统创建服务,创建时指定服务的属性,函数原型如下:

SC_HANDLE CreateService(
SC_HANDLE hSCManager, //服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCManager 返回
LPCTSTR lpServiceName, //以NULL 结尾的服务名,用于创建登记数据库中的关键字
LPCTSTR lpDisplayName, //以NULL 结尾的服务名,用于用户界面标识服务
DWORD dwDesiredAccess, //指定服务返回类型
DWORD dwServiceType, //指定服务类型
DWORD dwStartType, //指定何时启动服务
DWORD dwErrorControl, //指定服务启动失败的严重程度
LPCTSTR lpBinaryPathName, //指定服务程序二进制文件的路径
LPCTSTR lpLoadOrderGroup, //指定顺序装入的服务组名
LPDWORD lpdwTagId, //忽略,NULL
LPCTSTR lpDependencies, //指定启动该服务前必须先启动的服务或服务组
LPCTSTR lpServiceStartName, //以NULL 结尾的字符串,指定服务帐号。如是NULL,则表示使用LocalSystem帐号
LPCTSTR lpPassword //以NULL 结尾的字符串,指定对应的口令。为NULL表示无口令。但使用LocalSystem时填NULL
);

 

v 参数

CreateService 函数的参数很多,但是设置方法都很简单,直接从参数名就可大体知道参数的意义。 

v 返回值 

返回 SC_HANDLE 类型,服务的句柄。

③ OpenService

打开服务,获取服务句柄,函数原型如下: 

WINAPI OpenServiceW(

    _In_            SC_HANDLE               hSCManager,

    _In_            LPCWSTR                lpServiceName,

    _In_            DWORD                   dwDesiredAccess

    );

④ DeleteService

删除服务,以服务句柄为参数,函数原型如下: 

WINAPI DeleteService(

    _In_        SC_HANDLE   hService

    );

2. 启动、停止服务、向服务发送控制请求

① StartService

启动服务,并设置服务主函数的参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值