スキップしてメイン コンテンツへ

 locked
SetServiceStatus 関数にて SERVICE_STOPPED を通知しても直ちに反映されない現象について RRS feed

  • 全般的な情報交換

  • こんにちは、Platform SDK (Windows SDK) サポートチームです。

    今回は、SetServiceStatus 関数にて SERVICE_STOPPED を通知しても直ちに反映されない現象についてご案内します。

     

    現象

    サービス アプリケーションの停止時には SERVICE_STOPPED をセットして SetServiceStatus 関数を呼び出しますが、SetServiceStatus 関数を呼び出した後のしばらくの間、サービスの状態は SERVICE_STOP_PENDING のままです。

    このタイミングで対象のサービス アプリケーションに対して QueryServiceStatus 関数を呼び出して状態を確認すると、SERVICE_STATUS 構造体の dwCurrentState の値は SERVICE_STOP_PENDING のままですが、dwWaitHint dwCheckPoint の値は 0 にリセットされています。

    この時、その他のメンバは SetServiceStatus 関数の呼び出し時に指定した値が反映されています。

     

    原因

    サービス コントロール マネージャは、サービス アプリケーションから SERVICE_STOPPED の通知を受け取っても直ちには反映させず、サービス アプリケーションのプロセスが終了するのを待って SERVICE_STOPPED の状態へ変更します。

    このような動作は Windows の想定された動作であり、サービス アプリケーションが完全に終了する前に再度サービスを開始させた場合に、2 つのインスタンスが同時に起動した状態になってしまうことを防ぐために行われます。

     

    補足

    上記のような理由から、サービス アプリケーションが停止したことを判断する目的で、QueryServiceStatus 関数を呼び出して取得される dwWaitHint dwCheckPoint の値の変化から判定すると正しい結果が得られない場合があります。

    正確に判断するためには、dwCurrentState SERVICE_STOPPED になったことから判定を行ってください。

    2019年9月17日 9:08
    所有者