StartServiceA 函数 (winsvc.h)

启动服务。

语法

BOOL StartServiceA(
  [in]           SC_HANDLE hService,
  [in]           DWORD     dwNumServiceArgs,
  [in, optional] LPCSTR    *lpServiceArgVectors
);

参数

[in] hService

服务的句柄。 此句柄由 OpenServiceCreateService 函数返回,并且必须具有SERVICE_START访问权限。 有关详细信息,请参阅 服务安全和访问权限

[in] dwNumServiceArgs

lpServiceArgVectors 数组中的字符串数。 如果 lpServiceArgVectors 为 NULL,则此参数可以为零。

[in, optional] lpServiceArgVectors

要作为参数传递给服务的 ServiceMain 函数的 null 终止字符串。 如果没有参数,此参数可以为 NULL。 否则,第一个参数(lpServiceArgVectors[0])是服务的名称,后跟任何其他参数(lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServiceArgs-1])。

驱动程序服务不会接收这些参数。

返回值

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

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

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

返回代码 描述
ERROR_ACCESS_DENIED
句柄没有SERVICE_START访问权限。
ERROR_INVALID_HANDLE
句柄无效。
ERROR_PATH_NOT_FOUND
找不到服务二进制文件。
ERROR_SERVICE_ALREADY_RUNNING
服务的实例已在运行。
ERROR_SERVICE_DATABASE_LOCKED
数据库已锁定。
ERROR_SERVICE_DEPENDENCY_DELETED
该服务取决于不存在或已标记为要删除的服务。
ERROR_SERVICE_DEPENDENCY_FAIL
该服务依赖于另一个未能启动的服务。
ERROR_SERVICE_DISABLED
服务已被禁用。
ERROR_SERVICE_LOGON_FAILED
由于登录失败,服务未启动。 如果将服务配置为在没有“以服务身份登录”的帐户下运行,则会发生此错误。
ERROR_SERVICE_MARKED_FOR_DELETE
服务已被标记为要删除。
ERROR_SERVICE_NO_THREAD
无法为服务创建线程。
ERROR_SERVICE_REQUEST_TIMEOUT
服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能会被阻止在控制处理程序函数中。

言论

启动驱动程序服务后,StartService 函数不会返回,直到设备驱动程序完成初始化。

启动服务时,服务控制管理器(SCM)会在必要时生成服务进程。 如果指定的服务与其他服务共享进程,则所需的进程可能已存在。 StartService 函数不会等待新服务中的第一次状态更新,因为它可能需要一段时间。 相反,当 SCM 从服务控制调度程序收到通知时返回,指示已成功创建此服务的 ServiceMain 线程。

SCM 在从 StartService返回之前设置以下默认状态值:

  • 服务的当前状态设置为SERVICE_START_PENDING。
  • 接受的控件设置为无(零)。
  • CheckPoint 值设置为零。
  • WaitHint 时间设置为 2 秒。
调用过程可以通过定期调用 QueryServiceStatus 函数来查询服务的状态来确定新服务是否已完成其初始化。

在初始化期间,服务无法调用 startService 。 原因是 SCM 在初始化期间锁定服务控制数据库,因此调用 StartService 将阻止。 服务向 SCM 报告成功启动后,可以调用 StartService

ControlService一样,如果任何服务正忙于处理控制代码,StartService 将阻止 30 秒。 如果超时到期时忙服务仍未从其处理程序函数返回,StartService 失败并出现ERROR_SERVICE_REQUEST_TIMEOUT。 这是因为 SCM 一次只处理一个服务控制通知。

例子

有关示例,请参阅 启动服务

注意

winsvc.h 标头将 StartService 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows Server 2003 [仅限桌面应用]
目标平台 窗户
标头 winsvc.h (包括 Windows.h)
Advapi32.lib
DLL Advapi32.dll

另请参阅

ControlService

CreateService

DeleteService

OpenService

QueryServiceDynamicInformation

QueryServiceStatusEx

Service Functions

服务启动

ServiceMain