SetServiceStatus

呼び出し側サービスについて、サービス制御マネージャのステータス情報を更新する。

SetServiceStatus hServiceStatus, lpServiceStatus

hServiceStatus : [intptr] 現在のサービスのステータス情報構造体へのハンドル。このハンドルは RegisterServiceCtrlHandlerEx 関数が返す。
lpServiceStatus : [var] 呼び出し側サービスの最新のステータス情報を含む SERVICE_STATUS 構造体へのポインタ。

(プラグイン / モジュール : advapi32.dll)

解説

呼び出し側サービスについて、サービス制御マネージャのステータス情報を更新する。

[戻り値]
関数が成功した場合、戻り値は 0 以外となる。関数が失敗した場合、戻り値は 0 となる。拡張エラー情報を取得するには
GetLastError
を呼び出す。以下のエラーコードがサービス制御マネージャによって設定される場合がある。そのほかのエラーコードは、サービス制御マネージャが呼び出すレジストリ関数によって設定される場合がある。
(以下省略)

[備考]
ServiceMain 関数は最初に RegisterServiceCtrlHandlerEx 関数を呼び出してサービスの
SERVICE_STATUS_HANDLE を取得する。その後、ただちに SetServiceStatus
関数を呼び出してサービス制御マネージャに状態が SERVICE_START_PENDING
であることを通知する。初期化中、サービスは進行中であるが追加の時間が必要であることを示すために更新ステータスを提供できる。よくあるバグは、メインスレッドで初期化を行う一方、別のスレッドが
SetServiceStatus
を呼び出し続けて、サービス制御マネージャがハングとしてマークするのを防ぐというものである。しかし、メインスレッドがハングした場合、ワーカースレッドはメインスレッドが進行中であると報告し続けるため、サービスの起動は無限ループになる。制御要求を処理した後、サービスの
Handler 関数はサービス状態が変化した場合にサービス制御マネージャに新しい状態を報告するために SetServiceStatus
を呼び出さなければならない。これは、サービスが状態を変更する場合(停止やシャットダウン制御の処理時など)にのみ必要である。サービスは、回復可能なエラーによって停止しなければならない場合など、状態変更をサービス制御マネージャに通知するために、サービスの任意のスレッドから任意のタイミングでこの関数を使用することもできる。サービスがサービスステータスハンドルを取得するために
RegisterServiceCtrlHandlerEx を呼び出した後にのみ、この関数を呼び出すことができる。サービスが
dwCurrentState メンバを SERVICE_STOPPED に、dwWin32ExitCode メンバを 0
以外の値に設定して SetServiceStatus を呼び出すと、次のエントリがシステムイベントログに書き込まれる:
(以下省略)

情報

プラグイン / モジュール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