コントロール ハンドラー関数の記述
ハンドラー関数は、ディスパッチャー スレッドによって呼び出されると、Opcode パラメーターで渡されたコントロール コードを処理し、ReportSvcStatus 関数を呼び出してサービスの状態を更新します。 Handler 関数は、コントロール コードを受け取ると、コントロール コードの処理によってサービスの状態が変更された場合にのみ、サービスの状態を報告する必要があります。 サービスがコントロールに対して機能しない場合は、サービス コントロール マネージャーに状態を報告しないでください。 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;
}
}
関連トピック