<Return[S]><Top>

StartServiceCtrlDispatcher

Declare Function Api_StartServiceCtrlDispatcher& Lib "advapi32" Alias "StartServiceCtrlDispatcherA" (lpServiceStartTable As SERVICE_TABLE_ENTRY)

Declare Function StartServiceCtrlDispatcher Lib "advapi32" Alias "StartServiceCtrlDispatcherA" (lpServiceStartTable As SERVICE_TABLE_ENTRY) As Long

サービスプロセスのメインスレッドをサービス制御マネージャに接続し、そのスレッドを呼び出し側プロセス用のサービス制御ディスパッチャスレッドにする。

パラメータ
lpServiceTable
    [入力] 構造体の配列へのポインタを指定する。これらの構造体には、呼び出し側プロセス内で実行できるサービスごとに 1 つのエントリ

    が格納されている。テーブル内の最後のエントリのメンバは、テーブルの終わりを示すために NULL 値にしなければならない。

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

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

    エラーコード                                                   

意味                                                                                                                    

    ERROR_INVALID_DATA

指定されたディスパッチテーブルに、不適切な形式のエントリが含まれている。

    ERROR_SERVICE_ALREADY_RUNNING

 

Windows 2000:このプロセスはすでに StartServiceCtrlDispatcher 関数を呼び出した。各プロセスは StartServiceCtrlDispatcher 関数を 1 回だけ呼び出せる。

 

解説
    サービス制御マネージャはサービスプロセスを開始した後、そのプロセスが StartServiceCtrlDispatcher 関数を呼び出すのを待機する。サ

    ービスプロセスのメインスレッドは、起動後できるだけ早くこの呼び出しを行わなければならない。StartServiceCtrlDispatcher 関数が成功

    すると、この関数は呼び出し側スレッドをサービス制御マネージャに接続し、プロセス内で動作しているすべてのサービスが終了するまで制

    御を戻さない。サービス制御マネージャはこの接続を使って、制御の要求とサービス開始の要求をサービスプロセスのメインスレッドへ送信す

    る。メインスレッドは、制御の要求を処理するために適切な Handler 関数を呼び出すか、新しいサービスの開始時に適切な ServiceMain

    関数を実行するために新しいスレッドを作成することによって、ディスパッチャとして機能する。
    lpServiceTable パラメータは、呼び出し側プロセス内で動作できるサービスごとに 1 つのエントリを保持する。各エントリは、そのサービス用

    のServiceMain 関数を指定する。SERVICE_WIN32_SHARE_PROCESS サービスでは、各エントリは 1 つのサービスの名前を保持して

    いなければならない。この名前は、サービスのインストール時に CreateService 関数で指定されたサービス名である。

    SERVICE_WIN32_OWN_PROCESS サービスでは、テーブルエントリ内のサービス名は無視される。サービスが専用のプロセス内で動作

    している場合、そのサービスプロセスのメインスレッドは即座に StartServiceCtrlDispatcher 関数を呼び出さなければならない。サービスが

    開始されると、そのサービスの ServiceMain 関数内ですべての初期化作業が実施される。
    複数のサービスが 1 つのプロセスを共有していて、どの ServiceMain 関数を呼び出すよりも前にプロセス全体に共通する何らかの初期化を

    行う必要がある場合は、メインスレッドは StartServiceCtrlDispatcher 関数を呼び出す前にこの作業を行うことができるが、30 秒以内とい

    う制限がある。それ以外の場合、ほかのスレッドを作成してプロセス全体の初期化を行わなければならない。一方、メインスレッドは

    StartServiceCtrlDispatcher 関数を呼び出して、サービス制御ディスパッチャになる。サービス固有の初期化は、依然として個別のサービ

    スのメイン関数内で実行する必要がある。