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

LPHANDLER_FUNCTION_EX

コールバック

シグネチャ

DWORD LPHANDLER_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 はエラーを返します。コントロールハンドラーの実行中にサービスが長時間の処理を行う必要がある場合は、 二次スレッドを作成してその処理を実行し、コントロールハンドラーからはすぐに戻るようにしてください。これにより、サービスが コントロールディスパッチャーを占有し、他のサービスがコントロールコードを受け取れなくなることを防げます。

サービスのシャットダウンに使用できる時間は限られている (約 20 秒) ため、SERVICE_CONTROL_SHUTDOWN コントロールコードは、 シャットダウン中にどうしてもクリーンアップが必要なサービスだけが処理するようにしてください。この 時間が経過すると、サービスのシャットダウンが完了しているかどうかにかかわらず、システムのシャットダウンが進行します。なお、システムが シャットダウン状態のまま (再起動も電源切断もされずに) 置かれた場合、サービスは実行され続けます。サービスが 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)