LockServiceDatabase 関数 (winsvc.h)

[Windows Vista の時点では、この関数はアプリケーションの互換性のために提供されており、データベースには影響しません。]

サービス 制御マネージャー (SCM) データベース ロックの所有権を要求します。 ロックを所有できるプロセスは、指定した時点で 1 つだけです。

構文

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