Win32 API 日本語リファレンス
ホーム › System.Services › HANDLER_FUNCTION_EX

HANDLER_FUNCTION_EX

コールバック

シグネチャ

DWORD HANDLER_FUNCTION_EX(
    DWORD dwControl,
    DWORD dwEventType,
    void* lpEventData,
    void* lpContext
);

パラメーター

フィールド型説明
dwControlDWORD

コントロールコードです。このパラメーターには、次の値のいずれかを指定できます。

コントロールコード 意味
SERVICE_CONTROL_CONTINUE
0x00000003
一時停止中のサービスに、処理を再開すべきことを通知します。
SERVICE_CONTROL_INTERROGATE
0x00000004
サービスに、現在の状態情報をサービスコントロールマネージャーへ報告するよう通知します。

ハンドラーは単に NO_ERROR を返してください。SCM はサービスの現在の状態を把握しています。

SERVICE_CONTROL_NETBINDADD
0x00000007
ネットワークサービスに、バインド対象の新しいコンポーネントがあることを通知します。サービスは、その新しいコンポーネントにバインドしてください。

アプリケーションでは、代わりにプラグアンドプレイ機能を使用してください。

SERVICE_CONTROL_NETBINDDISABLE
0x0000000A
ネットワークサービスに、そのバインドの 1 つが無効化されたことを通知します。サービスは、バインド情報を読み直してそのバインドを削除してください。

アプリケーションでは、代わりにプラグアンドプレイ機能を使用してください。

SERVICE_CONTROL_NETBINDENABLE
0x00000009
ネットワークサービスに、無効化されていたバインドが有効化されたことを通知します。サービスは、バインド情報を読み直して新しいバインドを追加してください。

アプリケーションでは、代わりにプラグアンドプレイ機能を使用してください。

SERVICE_CONTROL_NETBINDREMOVE
0x00000008
ネットワークサービスに、バインド対象のコンポーネントが削除されたことを通知します。サービスは、バインド情報を読み直して、削除されたコンポーネントとのバインドを解除してください。

アプリケーションでは、代わりにプラグアンドプレイ機能を使用してください。

SERVICE_CONTROL_PARAMCHANGE
0x00000006
サービスに、サービス固有のスタートアップパラメーターが変更されたことを通知します。サービスは、スタートアップパラメーターを読み直してください。
SERVICE_CONTROL_PAUSE
0x00000002
サービスに、一時停止すべきことを通知します。
SERVICE_CONTROL_SHUTDOWN
0x00000005
サービスに、システムがシャットダウン中であることを通知し、サービスがクリーンアップ処理を実行できるようにします。SERVICE_CONTROL_PRESHUTDOWN 通知に登録しているサービスは、すでに停止しているためこの通知を受け取れないことに注意してください。

サービスがこのコントロールコードを受け付ける場合、クリーンアップ処理を実行した後に停止し、NO_ERROR を返す必要があります。SCM はこのコントロールコードを送信した後、そのサービスに他のコントロールコードを送信しません。

詳細については、このトピックの「解説」セクションを参照してください。

SERVICE_CONTROL_STOP
0x00000001
サービスに、停止すべきことを通知します。

サービスがこのコントロールコードを受け付ける場合、受信時に停止して NO_ERROR を返す必要があります。SCM はこのコントロールコードを送信した後、そのサービスに他のコントロールコードを送信しません。 Windows XP: サービスが NO_ERROR を返して実行を継続した場合、引き続きコントロールコードを受信します。この動作は、Windows Server 2003 および Windows XP with SP2 以降で変更されました。

このパラメーターには、次の拡張コントロールコードのいずれかを指定することもできます。これらのコントロールコードは Handler 関数ではサポートされていないことに注意してください。

コントロールコード 意味
SERVICE_CONTROL_DEVICEEVENT
0x0000000B
サービスにデバイスイベントを通知します (サービスは、これらの通知を受け取るために RegisterDeviceNotification 関数で 登録しておく必要があります)。dwEventType パラメーターと lpEventData パラメーターに追加情報が格納されます。
SERVICE_CONTROL_HARDWAREPROFILECHANGE
0x0000000C
サービスに、コンピューターのハードウェアプロファイルが変更されたことを通知します。dwEventType パラメーターに追加情報が格納されます。
SERVICE_CONTROL_POWEREVENT
0x0000000D
サービスにシステムの電源イベントを通知します。dwEventType パラメーターに追加情報が格納されます。dwEventType が PBT_POWERSETTINGCHANGE の場合は、lpEventData パラメーターにも追加情報が格納されます。
SERVICE_CONTROL_SESSIONCHANGE
0x0000000E
サービスにセッション変更イベントを通知します。 サービスは、ログオンが試行される前に完全に読み込まれている場合にのみ、ユーザーのログオンを通知される点に注意してください。dwEventType パラメーターと lpEventData パラメーターに追加情報が格納されます。
SERVICE_CONTROL_PRESHUTDOWN
0x0000000F
サービスに、システムがこれからシャットダウンすることを通知します。システムシャットダウン時の厳しい時間制限を超えて クリーンアップ処理に時間を要するサービスは、この通知を利用できます。サービスコントロールマネージャーは、SERVICE_CONTROL_SHUTDOWN 通知に登録しているアプリケーションへその通知を送信する前に、 この通知に登録しているアプリケーションへこの通知を送信します。

この通知を処理するサービスは、そのサービスが停止するか、 SERVICE_PRESHUTDOWN_INFO で指定された プレシャットダウンのタイムアウト間隔が経過するまで、システムのシャットダウンをブロックします。これはユーザー体験に影響するため、 サービスは、データ損失や次回のシステム起動時の大幅な復旧時間を避けるためにどうしても必要な場合にのみ、この機能を使用してください。

Windows Server 2003 および Windows XP: この値はサポートされていません。

SERVICE_CONTROL_TIMECHANGE
0x00000010
サービスに、システム時刻が変更されたことを通知します。lpEventData パラメーターに追加情報が格納されます。dwEventType パラメーターは使用されません。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: このコントロールコードはサポートされていません。

SERVICE_CONTROL_TRIGGEREVENT
0x00000020
サービストリガーイベントに登録されたサービスに、そのイベントが発生したことを通知します。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: このコントロールコードはサポートされていません。

SERVICE_CONTROL_USERMODEREBOOT
0x00000040
サービスに、ユーザーが再起動を開始したことを通知します。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: このコントロールコードはサポートされていません。

このパラメーターには、次の表に示すユーザー定義のコントロールコードを指定することもできます。

コントロールコード 意味
128 から 255 の範囲。
コントロールコードに関連付けられる動作は、サービスが定義します。
dwEventTypeDWORD

発生したイベントの種類です。このパラメーターは、dwControl が SERVICE_CONTROL_DEVICEEVENT、SERVICE_CONTROL_HARDWAREPROFILECHANGE、SERVICE_CONTROL_POWEREVENT、 SERVICE_CONTROL_SESSIONCHANGE のいずれかである場合に使用されます。それ以外の場合は 0 です。

dwControl が SERVICE_CONTROL_DEVICEEVENT の場合、このパラメーターには次の値のいずれかを 指定できます。

dwControl が SERVICE_CONTROL_HARDWAREPROFILECHANGE の場合、このパラメーターには次の値のいずれかを 指定できます。 dwControl が SERVICE_CONTROL_POWEREVENT の場合、このパラメーターには WM_POWERBROADCAST メッセージの wParam パラメーターで指定される値のいずれかを指定できます。

dwControl が SERVICE_CONTROL_SESSIONCHANGE の場合、このパラメーターには WM_WTSSESSION_CHANGE メッセージの wParam パラメーターで 指定される値のいずれかを指定できます。

lpEventDatavoid*

必要に応じて渡される追加のデバイス情報です。このデータの形式は、 dwControl パラメーターと dwEventType パラメーターの値によって異なります。

dwControl が SERVICE_CONTROL_DEVICEEVENT の場合、このデータは、アプリケーションが WM_DEVICECHANGE メッセージの一部として受け取る lParam パラメーターに相当します。

dwControl が SERVICE_CONTROL_POWEREVENT で、dwEventType が PBT_POWERSETTINGCHANGE の場合、このデータは POWERBROADCAST_SETTING 構造体へのポインターです。

dwControl が SERVICE_CONTROL_SESSIONCHANGE の場合、このパラメーターは WTSSESSION_NOTIFICATION 構造体へのポインターです。

dwControl が SERVICE_CONTROL_TIMECHANGE の場合、このデータは SERVICE_TIMECHANGE_INFO 構造体へのポインターです。

lpContextvoid*RegisterServiceCtrlHandlerEx から渡された ユーザー定義のデータです。 複数のサービスが 1 つのプロセスを共有している場合、lpContext パラメーターはサービスの識別に 役立ちます。

公式ドキュメント

RegisterServiceCtrlHandlerEx 関数と共に使用される、アプリケーション定義のコールバック関数です。 サービスプログラムは、これを特定のサービスのコントロールハンドラー関数として使用できます。

LPHANDLER_FUNCTION_EX 型は、この関数へのポインターを定義します。 HandlerEx は、アプリケーション定義の名前のプレースホルダーです。

この関数は、RegisterServiceCtrlHandler 関数と共に使用される Handler コントロールハンドラー関数に代わるものです。 サービスはどちらのコントロールハンドラーも使用できますが、新しいコントロールハンドラーはユーザー定義のコンテキストデータと追加の拡張コントロールコードをサポートします。

戻り値

この関数の戻り値は、受け取ったコントロールコードによって異なります。

この戻り値の規則は次のとおりです。

解説(Remarks)

サービスが開始されると、その ServiceMain 関数は 直ちに RegisterServiceCtrlHandlerEx 関数を呼び出して、コントロール要求を処理する HandlerEx 関数を指定する必要があります。 受け付けるコントロールコードを指定するには、 SetServiceStatus 関数と RegisterDeviceNotification 関数を使用します。

サービスのメインスレッドにあるコントロールディスパッチャーは、サービスコントロールマネージャーからコントロール要求を受け取るたびに、 指定されたサービスのコントロールハンドラー関数を呼び出します。コントロール要求の処理後、サービスの状態が変化した場合は、 コントロールハンドラーが SetServiceStatus を呼び出して、 新しい状態をサービスコントロールマネージャーに報告する必要があります。

コントロールハンドラー関数は、通知を受け取ったら直ちに戻ることを想定しています。コールバック関数は、パラメーターを保存し、 追加の処理を行う別のスレッドを作成してください (アプリケーションは、サービスを停止する前にそれらのスレッドが終了していることを 保証する必要があります)。特に、コントロールハンドラーでは、ロックの取得などブロックする可能性のある操作を避けてください。デッドロックやシステムの応答停止を引き起こすおそれがあります。

サービスコントロールマネージャーは、サービスにコントロールコードを送信すると、他のサービスへ追加のコントロールコードを送信する前に、 ハンドラー関数が戻るのを待ちます。コントロールハンドラーはできるだけ速やかに戻る必要があり、30 秒以内に戻らない場合、 SCM はエラーを返します。コントロールハンドラーの実行中に長時間の処理が必要な場合は、その処理を行うセカンダリスレッドを作成してから コントロールハンドラーを抜けてください。これにより、サービスがコントロールディスパッチャーを占有し、 他のサービスがコントロールコードを受け取れなくなることを防げます。

SERVICE_CONTROL_SHUTDOWN コントロールコードは、シャットダウン時にどうしてもクリーンアップが必要なサービスだけが 処理すべきです。サービスのシャットダウンに使える時間は限られている (約 20 秒) ためです。この時間が経過すると、 サービスのシャットダウンが完了しているかどうかに関わらず、システムのシャットダウンが進行します。なお、システムがシャットダウン状態のまま (再起動も電源オフもされずに) 残された場合、サービスは実行を継続します。サービスが SERVICE_CONTROL_SHUTDOWN を受け付けるよう登録した場合、そのコントロールコードを処理して NO_ERROR を返す必要があります。このコントロールコードに対してエラーを返し、速やかに停止しないと、システムのシャットダウンに要する時間が長くなる可能性があります。システムは、サービスのシャットダウンに許された時間が満了するまで待たなければ、システムのシャットダウンを進められないためです。

クリーンアップにさらに時間が必要な場合、サービスは待機ヒントを添えて STOP_PENDING 状態のメッセージを送信し、 サービスのシャットダウンが完了したとシステムに報告するまでにどれだけ待てばよいかを、サービスコントローラーに知らせてください。 ただし、サービスがシャットダウンを妨げないよう、サービスコントローラーが待機する時間には上限があります。サービススナップインからサービスをシャットダウンする場合、上限は 125 秒です。オペレーティングシステムが再起動する場合、制限時間は次のレジストリキーの WaitToKillServiceTimeout 値で指定されます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

プラグアンドプレイのデバイスイベントは、必ずできるだけ速やかに処理してください。そうしないと、システムが応答しなくなる 可能性があります。イベントハンドラーで実行をブロックする可能性のある操作 (I/O など) を行う場合は、別のスレッドを開始して 非同期に処理するのが最適です。

サービスは、SetConsoleCtrlHandler 関数を使用して シャットダウン通知を受け取ることもできます。この通知は、実行中のアプリケーションがシャットダウンするときに受け取ります。 これは、サービスがシャットダウンされる前に発生します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)