服务入口
通常,我们把服务做成控制台程序。控制台程序的入口是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函数来处理服务控制请求。