LockServiceDatabase功能锁定指定的数据库。
SC_LOCK LockServiceDatabase(
SC_HANDLE 【hSCManager】 | //服务控制管理器数据库的句柄 |
); |
参数
【hSCManager】
标识服务控制管理器数据库。OpenSCManager函数返回此句柄,该句柄必须具有SC_MANAGER_LOCK访问权限。
返回值
如果函数成功,则返回值是指定的服务控制管理器数据库的锁定。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
错误
以下错误代码可能由服务控制管理器设置。其他错误代码可以由服务控制管理器调用的注册表功能设置。
值 | 含义 |
ERROR_ACCESS_DENIED | 没有使用SC_MANAGER_LOCK访问来打开指定的句柄。 |
ERROR_INVALID_HANDLE | 指定的句柄无效。 |
ERROR_SERVICE_DATABASE_LOCKED | 数据库被锁定。 |
备注
LockServiceDatabase函数尝试获取指定数据库上的锁。一次只能有一个进程可以锁定数据库。
锁是安装和配置程序和服务控制管理器使用的协议,用于序列化对注册表中服务树的访问。服务控制管理员唯一获取锁的时间是启动服务时。在使用ChangeServiceConfig或SetServiceObjectSecurity功能重新配置服务之前,预期安装和配置程序将获取锁定。在使用注册表功能重新配置服务之前,他们也应该获取一个锁。该锁可防止服务控制管理器在重新配置时启动服务。
调用StartService功能以在锁定的数据库中启动服务失败。所有其他服务控制管理器功能不受锁定的影响。
在随后调用UnlockServiceDatabase功能之前,锁定被保持,直到指定了SC_LOCK句柄。如果持有锁的进程终止,则服务控制管理器将自动清除并释放锁。
也可以看看
ChangeServiceConfig, OpenSCManager, QueryServiceLockStatus, SetServiceObjectSecurity, StartService, UnlockServiceDatabase