StartServiceCtrlDispatcherW

サービスプロセスのメインスレッドをサービス制御マネージャに接続し、そのスレッドを呼び出し側プロセスのサービス制御ディスパッチャスレッドにする。(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
URLhttps://github.com/inovia/IronHSP
備考Win32 API の advapi32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_advapi32_gen2.hs