服务入口点
服务通常以控制台应用程序的形式编写。 控制台应用程序的入口点是其 主要 函数。 主 函数从服务的注册表项 ImagePath 值接收参数。 有关详细信息,请参阅 CreateService 函数的“备注”部分。
当 SCM 启动服务程序时,它会等待它调用 StartServiceCtrlDispatcher 函数。 使用以下准则。
- SERVICE_WIN32_OWN_PROCESS类型的服务应立即从主线程调用 StartServiceCtrlDispatcher。 可以在服务启动后执行任何初始化,如 ServiceMain 函数中所述。
- 如果服务类型SERVICE_WIN32_SHARE_PROCESS并且程序中所有服务都有常见的初始化,则可以先在主线程中执行初始化,然后再调用 StartServiceCtrlDispatcher,只要它花费不到 30 秒。 否则,必须创建另一个线程来执行常见的初始化,而主线程调用 StartServiceCtrlDispatcher。 在服务启动后,仍应执行任何特定于服务的初始化。
StartServiceCtrlDispatcher 函数为进程中包含的每个服务采用 SERVICE_TABLE_ENTRY 结构。 每个结构指定服务名称和入口点。 有关示例,请参阅 编写服务程序的主要函数。
如果 StartServiceCtrlDispatcher 成功,则在进程中的所有正在运行的服务都进入SERVICE_STOPPED状态之前,调用线程才会返回。 SCM 通过命名管道向此线程发送控制请求。 线程充当控制调度程序,执行以下任务:
- 创建新线程,以在启动新服务时调用相应的入口点。
- 调用相应的 处理程序函数 来处理服务控制请求。
相关主题