RegisterServiceCtrlHandlerExW

拡張サービス制御要求を処理する関数を登録する。(Unicode)

RegisterServiceCtrlHandlerExW lpServiceName, lpHandlerProc, lpContext

lpServiceName : [wstr] 呼び出しスレッドが実行するサービスの名前。これは、サービス制御プログラムがサービス作成時に CreateService 関数で指定したサービス名である。
lpHandlerProc : [int] 登録するハンドラ関数へのポインタ。詳細は HandlerEx を参照のこと。
lpContext : [intptr] ユーザ定義のデータ。ハンドラ関数に渡されるこのパラメータは、複数のサービスがプロセスを共有しているときにサービスを識別するのに役立つ。

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

解説

拡張サービス制御要求を処理する関数を登録する。(Unicode)

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

[備考]
新しいサービスの ServiceMain 関数は、ただちに RegisterServiceCtrlHandlerEx
関数を呼び出してコントロールディスパッチャに制御ハンドラ関数を登録すべきである。これにより、コントロールディスパッチャはこのサービスに対する制御要求を受け取ったときに指定した関数を呼び出せるようになる。指定可能な制御コードの一覧については
HandlerEx を参照のこと。呼び出し側プロセスのスレッドは、この関数が返すサービスステータスハンドルを使用して、その後の
SetServiceStatus 関数の呼び出しでサービスを識別できる。RegisterServiceCtrlHandlerEx
関数は最初の SetServiceStatus 呼び出しより前に呼び出す必要がある。これは
RegisterServiceCtrlHandlerEx
が呼び出し側で使用するサービスステータスハンドルを返し、他のサービスがこのサービス状態を誤って設定できないようにするためである。さらに、サービスが
SetServiceStatus
関数を通じて受け入れる制御を指定するまでに、制御ハンドラが制御要求を受け取れる状態になっていなければならない。制御ハンドラ関数が制御要求とともに呼び出されたとき、サービスはサービス状態が変化した場合にのみ(停止やシャットダウン制御の処理時など)SetServiceStatus
を呼び出してサービス制御マネージャに状態を報告する必要がある。サービス状態が変化していない場合、サービスはサービス制御マネージャに状態を報告すべきではない。サービスステータスハンドルは閉じる必要はない。
> [!NOTE] > winsvc.h ヘッダは RegisterServiceCtrlHandlerEx
をエイリアスとして定義しており、UNICODE プリプロセッサ定数の定義に基づいて ANSI または Unicode
版を自動的に選択する。エンコーディングに中立なエイリアスをエンコーディング中立でないコードと混在させると、コンパイル時または実行時エラーとなる可能性がある。詳細は
[Conventions for Function
Prototypes](/windows/win32/intl/conventions-for-function-prototypes)
を参照のこと。

情報

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