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
与 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 |