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

LPHANDLER_FUNCTION

コールバック

シグネチャ

void LPHANDLER_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 は、アプリケーション定義の名前を表すプレースホルダーです。

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

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

例

例については、 コントロールハンドラー関数の記述を参照してください。

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