服务入口点

服务通常编写为控制台应用程序。 控制台应用程序的入口点是其main函数。 main 函数从服务的注册表项从 ImagePath 值接收参数。 有关详细信息,请参阅 CreateService 函数的“备注”部分。

当 SCM 启动服务程序时,它会等待它调用 StartServiceCtrlDispatcher 函数。 请遵循以下准则。

  • SERVICE_WIN32_OWN_PROCESS 类型的服务应立即从其main线程调用 StartServiceCtrlDispatcher。 可以在服务启动后执行任何初始化,如 服务服务Main 函数中所述。
  • 如果服务类型为SERVICE_WIN32_SHARE_PROCESS,并且程序中所有服务都有通用初始化,则可以在调用 StartServiceCtrlDispatcher 之前在main线程中执行初始化,只要它花费的时间少于 30 秒。 否则,必须创建另一个线程来执行常见初始化,而main线程调用 StartServiceCtrlDispatcher。 在服务启动后,仍应执行任何特定于服务的初始化。

StartServiceCtrlDispatcher 函数对进程中包含的每个服务采用SERVICE_TABLE_ENTRY结构。 每个结构指定服务名称和服务的入口点。 有关示例,请参阅编写服务程序的 main 函数

如果 StartServiceCtrlDispatcher 成功,则调用线程不会返回,直到进程中所有正在运行的服务都进入SERVICE_STOPPED状态。 SCM 通过命名管道向此线程发送控制请求。 线程充当控制调度程序,执行以下任务:

  • 创建新线程以在启动新服务时调用相应的入口点。
  • 调用相应的 处理程序函数 来处理服务控制请求。

编写服务程序的main函数