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 |
|||||||
サービスプロセスのメインスレッドをサービス制御マネージャに接続し、そのスレッドを呼び出し側プロセス用のサービス制御ディスパッチャスレッドにする。 |
|||||||
パラメータ
が格納されている。テーブル内の最後のエントリのメンバは、テーブルの終わりを示すために NULL 値にしなければならない。 コードを設定することがある。
解説 ービスプロセスのメインスレッドは、起動後できるだけ早くこの呼び出しを行わなければならない。StartServiceCtrlDispatcher 関数が成功 すると、この関数は呼び出し側スレッドをサービス制御マネージャに接続し、プロセス内で動作しているすべてのサービスが終了するまで制 御を戻さない。サービス制御マネージャはこの接続を使って、制御の要求とサービス開始の要求をサービスプロセスのメインスレッドへ送信す る。メインスレッドは、制御の要求を処理するために適切な Handler 関数を呼び出すか、新しいサービスの開始時に適切な ServiceMain
関数を実行するために新しいスレッドを作成することによって、ディスパッチャとして機能する。 のServiceMain 関数を指定する。SERVICE_WIN32_SHARE_PROCESS サービスでは、各エントリは 1 つのサービスの名前を保持して いなければならない。この名前は、サービスのインストール時に CreateService 関数で指定されたサービス名である。 SERVICE_WIN32_OWN_PROCESS サービスでは、テーブルエントリ内のサービス名は無視される。サービスが専用のプロセス内で動作 している場合、そのサービスプロセスのメインスレッドは即座に StartServiceCtrlDispatcher 関数を呼び出さなければならない。サービスが
開始されると、そのサービスの
ServiceMain 関数内ですべての初期化作業が実施される。 行う必要がある場合は、メインスレッドは StartServiceCtrlDispatcher 関数を呼び出す前にこの作業を行うことができるが、30 秒以内とい う制限がある。それ以外の場合、ほかのスレッドを作成してプロセス全体の初期化を行わなければならない。一方、メインスレッドは StartServiceCtrlDispatcher 関数を呼び出して、サービス制御ディスパッチャになる。サービス固有の初期化は、依然として個別のサービ スのメイン関数内で実行する必要がある。 |