StartServiceCtrlDispatcher

【勇芳软件工作室】汉化HomePreviousNext

StartServiceCtrlDispatcher函数将服务进程的主线程连接到服务控制管理器,这将使线程成为调用进程的服务控制分派器线程。

BOOL StartServiceCtrlDispatcher(

LPSERVICE_TABLE_ENTRY 【lpServiceStartTable】//服务表的地址
); 

参数

【lpServiceStartTable】

指向SERVICE_TABLE_ENTRY结构的数组,其中包含可在调用进程中执行的每个服务的一个条目。表中最后一个条目的成员必须具有NULL值来指定表的结尾。

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

错误

服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。

含义
ERROR_INVALID_DATA指定的分派表包含的格式不正确。

备注

当服务控制管理器启动服务进程时,它等待进程调用StartServiceCtrlDispatcher功能。服务进程的主线程应在启动后尽快进行此呼叫。如果StartServiceCtrlDispatcher成功,则将呼叫线程连接到服务控制管理器,并且不会返回,直到该进程中的所有正在运行的服务已终止。服务控制管理器使用此连接将控制和服务启动请求发送到服务进程的主线程。主线程通过调用适当的处理器功能来处理控制请求,或通过创建一个新的线程来执行新的服务启动时使用相应的ServiceMain功能,作为调度员。

【lpServiceStartTable】参数包含可以在调用进程中运行的每个服务的条目。每个条目指定该服务的ServiceMain功能。对于SERVICE_WIN32_SHARE_PROCESS服务,每个条目都必须包含服务的名称。该名称是服务安装后由CreateService功能指定的服务名称。对于SERVICE_WIN32_OWN_PROCESS服务,表项中的服务名称将被忽略。

如果一个服务在自己的进程中运行,服务进程的主线程应该立即调用StartServiceCtrlDispatcher.当服务启动时,所有初始化任务都在服务的ServiceMain功能中完成。

如果多个服务共享进程,并且在调用任何ServiceMain函数之前,需要完成一些常见的进程范围初始化,主线程可以在调用StartServiceCtrlDispatcher之前完成工作,只要花费少于30秒即可。否则,必须创建另一个线程来执行进程范围的初始化,而主线程调用StartServiceCtrlDispatcher并成为服务控制分派器。任何特定于服务的初始化都应该在单独的服务主要功能中完成。

也可以看看

ControlService, 处理器, RegisterServiceCtrlHandler, ServiceMain, SERVICE_TABLE_ENTRY