lockServiceDatabase 函数 (winsvc.h)

[从 Windows Vista 起,提供此函数是为了应用程序兼容性,对数据库没有影响。]

请求服务控制管理器 (SCM) 数据库锁的所有权。 在任何指定时间,只有一个进程可以拥有锁。

语法

SC_LOCK LockServiceDatabase(
  [in] SC_HANDLE hSCManager
);

参数

[in] hSCManager

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

返回值

如果函数成功,则返回值为指定 SCM 数据库的锁。

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

SCM 可以设置以下错误代码。 其他错误代码可由 SCM 调用的注册表函数设置。

返回代码 说明
ERROR_ACCESS_DENIED
句柄没有 SC_MANAGER_LOCK 访问权限。
ERROR_INVALID_HANDLE
指定的句柄无效。
ERROR_SERVICE_DATABASE_LOCKED
数据库已锁定。

注解

锁是安装程序和配置程序以及 SCM 用于序列化对注册表中服务树的访问的协议。 SCM 仅在启动服务时请求锁的所有权。

获取 SCM 数据库锁但无法释放的程序会阻止 SCM 启动其他服务。 由于此问题的严重性,不再允许进程锁定数据库。 为了与较旧的应用程序兼容, LockServiceDatabase 函数将返回锁,但没有其他效果。

Windows Server 2003 和 Windows XP: 获取 SCM 数据库锁会阻止 SCM 在释放锁之前启动服务。 例如,必须在启动多个相关服务之前配置多个相关服务的程序可以在配置第一个服务之前调用 LockServiceDatabase 。 或者,它可以确保完成配置之前,不会启动任何服务。

调用 StartService 函数以启动锁定数据库中的服务失败。 锁不会影响其他 SCM 函数。

在后续调用 UnlockServiceDatabase 函数时指定SC_LOCK句柄之前,将保留该锁。 如果拥有锁的进程终止,SCM 会自动清理并释放锁的所有权。

未能释放锁可能会导致系统问题。 获取锁的进程应尽快释放它。

要求

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

另请参阅

ChangeServiceConfig

OpenSCManager

QueryServiceLockStatus

服务配置

服务函数

SetServiceObjectSecurity

StartService

UnlockServiceDatabase