サービスプロセスのメインスレッドをサービス制御マネージャに接続し、そのスレッドを呼び出し側プロセスのサービス制御ディスパッチャスレッドにする。(Unicode)
StartServiceCtrlDispatcherW lpServiceStartTable
lpServiceStartTable : [var] 呼び出し側プロセスで実行できる各サービスについて 1 エントリを含む SERVICE_TABLE_ENTRY 構造体の配列へのポインタ。テーブルの終わりを示すため、テーブルの最後のエントリのメンバは NULL 値を持たなければならない。
(プラグイン / モジュール : advapi32.dll)
サービスプロセスのメインスレッドをサービス制御マネージャに接続し、そのスレッドを呼び出し側プロセスのサービス制御ディスパッチャスレッドにする。(Unicode) [戻り値] 関数が成功した場合、戻り値は 0 以外となる。関数が失敗した場合、戻り値は 0 となる。拡張エラー情報を取得するには GetLastError を呼び出す。以下のエラーコードがサービス制御マネージャによって設定される場合がある。そのほかのエラーコードは、サービス制御マネージャが呼び出すレジストリ関数によって設定される場合がある。 (以下省略) [備考] サービス制御マネージャがサービスプロセスを起動すると、プロセスが StartServiceCtrlDispatcher 関数を呼び出すのを待つ。サービスプロセスのメインスレッドは、起動後できるだけ早く(30 秒以内に)この呼び出しを行うべきである。StartServiceCtrlDispatcher が成功した場合、呼び出し側スレッドをサービス制御マネージャに接続し、プロセス内のすべての実行中サービスが SERVICE_STOPPED 状態になるまで復帰しない。サービス制御マネージャはこの接続を使用して、サービスプロセスのメインスレッドに制御要求とサービス開始要求を送信する。メインスレッドは、制御要求を処理するために適切な HandlerEx 関数を呼び出したり、新しいサービスが開始されたときに適切な ServiceMain 関数を実行する新しいスレッドを作成したりするディスパッチャとして機能する。lpServiceTable パラメータには、呼び出し側プロセスで実行できる各サービスのエントリが含まれる。各エントリはそのサービスの ServiceMain 関数を指定する。SERVICE_WIN32_SHARE_PROCESS サービスでは、各エントリにサービス名を含める必要がある。この名前は、サービスがインストールされたときに CreateService 関数によって指定されたサービス名である。SERVICE_WIN32_OWN_PROCESS サービスでは、テーブルエントリのサービス名は無視される。サービスが独自のプロセスで実行される場合、サービスプロセスのメインスレッドは直ちに StartServiceCtrlDispatcher を呼び出すべきである。すべての初期化タスクは、サービスが開始されたときにサービスの ServiceMain 関数内で行う。複数のサービスがプロセスを共有していて、いずれかの ServiceMain 関数が呼び出される前にプロセス全体の共通初期化を行う必要がある場合、メインスレッドは 30 秒未満であれば StartServiceCtrlDispatcher を呼び出す前にその作業を行える。そうでなければ、別のスレッドを作成してプロセス全体の初期化を行い、その間にメインスレッドが StartServiceCtrlDispatcher を呼び出してサービス制御ディスパッチャになる必要がある。サービス固有の初期化は、引き続き個々のサービスメイン関数で行うべきである。サービスはユーザインターフェイスを直接表示しようとすべきではない。詳細は対話型サービスを参照のこと。
| プラグイン / モジュール | advapi32.dll |
| バージョン | 1.0 |
| 作成日 | 2026/04/16 |
| 著作者 | IronHSP / CsWin32 bridge |
| URL | https://github.com/inovia/IronHSP |
| 備考 | Win32 API の advapi32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。 |
| タイプ | 拡張命令 |
| グループ | Win32API |
| 対応環境 |
|
| hs ファイル | hsphelp\win32_advapi32_gen2.hs |