コントロール ハンドラー関数の記述
ハンドラー 関数がディスパッチャー スレッドによって呼び出されると、Opcode パラメーターで渡されたコントロール コードを処理し、ReportSvcStatus 関数を呼び出してサービスの状態を更新します。 ハンドラー 関数がコントロール コードを受け取ると、コントロール コードを処理してサービスの状態が変更された場合にのみ、サービスの状態を報告する必要があります。 サービスがコントロールに対して動作しない場合は、サービス コントロール マネージャーに状態を報告しないでください。 ReportSvcStatus のソース コードについては、「ServiceMain 関数のの記述」を参照してください。
次の例では、SvcCtrlHandler 関数は、Handler 関数の例です。 ghSvcStopEvent 変数は、serviceMain 関数 の記述に関するで示されているように、初期化して使用する必要があるグローバル変数であることに注意してください。
//
// Purpose:
// Called by SCM whenever a control code is sent to the service
// using the ControlService function.
//
// Parameters:
// dwCtrl - control code
//
// Return value:
// None
//
VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
// Handle the requested control code.
switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
関連トピック