startServiceA 函数 (winsvc.h)
启动服务。
语法
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
参数
[in] hService
服务的句柄。 此句柄由 OpenService 或 CreateService 函数返回,并且必须具有SERVICE_START访问权限。 有关详细信息,请参阅 服务安全和访问权限。
[in] dwNumServiceArgs
lpServiceArgVectors 数组中的字符串数。 如果 lpServiceArgVectors 为 NULL,则此参数可以为零。
[in, optional] lpServiceArgVectors
要作为参数传递给 服务的 ServiceMain 函数的以 null 结尾的字符串。 如果没有参数,此参数可以为 NULL。 否则, (lpServiceArgVectors[0]) 的第一个参数是服务的名称,后跟 (lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServiceArgs-1] ) 的任何其他参数。
驱动程序服务不会接收这些参数。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
服务控制管理器可以设置以下错误代码。 其他可由服务控制管理器调用的注册表函数设置。
返回代码 | 说明 |
---|---|
|
句柄没有SERVICE_START访问权限。 |
|
该句柄无效。 |
|
找不到服务二进制文件。 |
|
服务的实例已在运行。 |
|
数据库已锁定。 |
|
该服务依赖于不存在或已标记为删除的服务。 |
|
该服务依赖于另一个无法启动的服务。 |
|
服务已被禁用。 |
|
由于登录失败而无法启动服务。 如果将服务配置为在没有“作为服务登录”权限的帐户下运行,则会发生此错误。 |
|
服务已标记为要删除。 |
|
无法为服务创建线程。 |
|
服务的进程已启动,但它未调用 StartServiceCtrlDispatcher,或者调用 StartServiceCtrlDispatcher 的线程可能在控制处理程序函数中被阻止。 |
注解
启动驱动程序服务时,在设备驱动程序完成初始化之前, StartService 函数不会返回。
启动服务时,服务控制管理器 (SCM) 生成服务进程(如有必要)。 如果指定的服务与其他服务共享进程,则所需的进程可能已存在。 StartService 函数不会等待新服务的第一次状态更新,因为它可能需要一段时间。 相反,当 SCM 收到来自服务控制调度程序的通知,指示已成功创建此服务的 ServiceMain 线程时,它将返回 。
SCM 在从 StartService 返回之前设置以下默认状态值:
- 服务的当前状态设置为SERVICE_START_PENDING。
- 接受的控件设置为无 (零) 。
- CheckPoint 值设置为零。
- WaitHint 时间设置为 2 秒。
服务在初始化期间无法调用 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 [仅限桌面应用] |
目标平台 | Windows |
标头 | winsvc.h (包括 Windows.h) |
Library | Advapi32.lib |
DLL | Advapi32.dll |