VC++ Service编程(三)服务入口

来源:互联网 发布:网络和ip地址计算 编辑:程序博客网 时间:2024/06/07 16:08

服务入口

    通常,我们把服务做成控制台程序。控制台程序的入口是main函数。main函数从注册表中的ImagePath值来获取参数,提供给服务。
    当SCM(服务控制管理器)开启一个服务,它就开始等待这个服务调用StartServiceCtrlDispatcher函数。使用下面的原则:
    1、SERVICE_WIN32_OWN_PROCESS类型的服务必须在主线程中马上调用StartServiceCtrlDispatcher函数。在服务启动后,你可以像“服务ServiceMain函数”中描述的那样,做任何初始化。
    2、 如果服务的类型是SERVICE_WIN32_SHARE_PROCESS,并且在这个服务中要为其它服务提供通用初始化。如果这些通用初始化可以在30秒内完成,你可以在主线程中调用StartServiceCtrlDispatcher函数之前做这些事情。否则,就必须创建另外一个线程来做这些通用的初始化。同时,在主线程中调用StartServiceCtrlDispatcher。
    StartServiceCtrlDispatcher为程序中的所有服务提供一个SERVICE_TABLE_ENTRY结构。每一个结构都指名服务的名称和入口。
    如果StartServiceCtrlDispatcher成功,调用它的线程要等到程序中所有服务都中止后才会返回。SCM利用一个已命名的管道来向这个线程发送控制请求。这个线程扮演一个控制调度员的角色,执行下面的任务:
    1、当新服务开始运行时,创建一个新的线程来调用相关的入口。
    2、调用相关的handler函数来处理服务控制请求。

0 0
原创粉丝点击