当前位置:   article > 正文

StartServiceCtrlDispatcher函数_startservicectrldispatcher failed with 997

startservicectrldispatcher failed with 997

将服务进程的主线程连接到服务控制管理器,这使得线程成为调用进程的服务控制调度程序线程。

语法

BOOL WINAPI StartServiceCtrlDispatcher(
  _In_ const SERVICE_TABLE_ENTRY * lpServiceTable
);
  • 1
  • 2
  • 3

参数
lpServiceTable [in]
指向SERVICE_TABLE_ENTRY结构数组的指针,该结构包含可在调用进程中执行的每个服务的一个条目。表中最后一个条目的成员必须具有NULL值才能指定表的结尾。

返回值
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。

返回码说明
ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
如果程序作为控制台应用程序而不是作为服务运行,则会返回此错误。如果程序将作为控制台应用程序运行以进行调试,请对其进行构造,以便在返回此错误时不会调用特定于服务的代码。

ERROR_INVALID_DATA
指定的调度表包含格式不正确的条目。

ERROR_SERVICE_ALREADY_RUNNING
该进程已调用StartServiceCtrlDispatcher。每个进程只能调用一次StartServiceCtrlDispatcher。

备注
当服务控制管理器启动服务进程时,它等待进程调用StartServiceCtrlDispatcher函数。服务进程的主线程应该在启动后(30秒内)尽快进行此调用。如果StartServiceCtrlDispatcher成功,它将调用线程连接到服务控制管理器,并且直到进程中的所有正在运行的服务都进入SERVICE_STOPPED状态才会返回。服务控制管理器使用此连接将控制和服务启动请求发送到服务进程的主线程。主线程通过调用适当的HandlerEx函数来处理控制请求,或者通过创建新线程来在启动新服务时执行适当的ServiceMain函数来充当调度程序。

lpServiceTable参数包含可在调用进程中运行的每个服务的条目。每个条目都指定该服务的ServiceMain函数。对于SERVICE_WIN32_SHARE_PROCESS服务,每个条目都必须包含服务的名称。此名称是安装服务时由CreateService函数指定的服务名称。对于SERVICE_WIN32_OWN_PROCESS服务,将忽略表条目中的服务名称。

如果服务在其自己的进程中运行,则服务进程的主线程应立即调用StartServiceCtrlDispatcher。启动服务时,所有初始化任务都在服务的ServiceMain函数中完成。

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

服务不应尝试直接显示用户界面。有关更多信息,请参阅交互式服务。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/69287
推荐阅读
相关标签
  

闽ICP备14008679号