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 によって呼び出されるレジストリ関数によって設定できます。
リターン コード | 説明 |
---|---|
|
ハンドルには 、SC_MANAGER_LOCK アクセス権がありません。 |
|
指定されたハンドルが無効です。 |
|
データベースがロックされています。 |
注釈
ロックは、セットアッププログラムと構成プログラム、およびレジストリ内のサービス ツリーへのアクセスをシリアル化するために 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 |