<Return[JKL]><Top>

LockServiceDatabase

Declare Function Api_LockServiceDatabase& Lib "advapi32" Alias "LockServiceDatabase" (ByVal hSCManager&)

Declare Function LockServiceDatabase Lib "advapi32" Alias "LockServiceDatabase" (ByVal hSCManager As Long) As Long

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

パラメータ
hSCManager
    [入力]サービス制御マネージャのデータベースのハンドルを指定する。OpenSCManager 関数が返したハンドルを指定し、これには

    SC_MANAGER_LOCK アクセス権が必要である。

戻り値
    関数が成功すると、サービス制御マネージャの指定されたデータベースのロックが返る。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、 関数を使う。
    サービス制御マネージャは次のエラーコードを設定することがある。サービス制御マネージャが呼び出したレジストリ関数は、その他のエラー

    コードを設定することがある。

    エラーコード                                                  

意味                                                                                                                 

    ERROR_ACCESS_DENIED

指定されたハンドルを開く際に、SC_MANAGER_LOCK アクセス権が指定されていなかった。

    ERROR_INVALID_HANDLE

指定されたハンドルは無効である。

    ERROR_SERVICE_DATABASE_LOCKED

データベースはすでにロックされている。


解説
    ロックとは、セットアッププログラムと構成プログラムが使用するプロトコルのことで、サービス制御マネージャはロックを利用してレジストリ内の

    サービスツリーへのアクセスをシリアル化する。サービス制御マネージャがロックの所有権を要求する唯一の状況は、サービス制御マネージ

    ャがサービスを開始するときである。
    SCM データベースのロックを取得すると、ロックが解放されるまでは、サービス制御マネージャはサービスを開始できなくなる。たとえば、あ

    るプログラムが相互に関連のあるいくつかのサービスを開始する前にそれらを構成しなければならない場合、最初のサービスを構成する前に

    LockServiceDatabase 関数を呼び出す必要がある。同様に、特定のサービスを開始する前にそのサービスに対して ChangeServiceConfig

    関数と ChangeServiceConfig2 関数の両方を呼び出す必要のあるプログラムは、どちらかの関数を呼び出す前に LockServiceDatabase 関

    数を呼び出さなければならない。
    すでにロックされているデータベースに対して StartService 関数を呼び出すと、その呼び出しは失敗する。サービス制御マネージャの他の関

    数は、ロックの影響を受けない。
    それ以降に SC_LOCK ハンドルを指定して UnlockServiceDatabase 関数を呼び出すまでは、ロックは保持される。あるロックを所有してい

    るプロセスが終了すると、サービス制御マネージャはロックを自動的にクリーンアップし、その所有権を解放する。