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

HANDLER_FUNCTION

コールバック

シグネチャ

void HANDLER_FUNCTION(
    DWORD dwControl
);

パラメーター

フィールド型説明
dwControlDWORD

- fdwControl [in]

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

制御コード 意味
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
サービスに、システムがシャットダウン中であることを通知します。サービスはクリーンアップ処理を実行できます。

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

詳細については、「解説」を参照してください。

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

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

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

制御コード 意味
128 ~ 255 の範囲。
制御コードに対応する動作はサービスが定義します。

公式ドキュメント

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

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

この関数は、 HandlerEx 制御ハンドラー関数 ( RegisterServiceCtrlHandlerEx 関数と共に使用します) に置き換えられました。サービスはどちらの制御ハンドラーも使用できますが、新しい制御ハンドラーはユーザー定義のコンテキストデータと追加の拡張制御コードをサポートします。

解説(Remarks)

サービスが開始されると、その ServiceMain 関数はただちに RegisterServiceCtrlHandler 関数を呼び出して、制御要求を処理する Handler 関数を指定する必要があります。

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

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

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

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

例

例については、 Writing a Control Handler Function を参照してください。

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