<Return[S]><Top>

SetServiceStatus

Declare Function Api_SetServiceStatus& Lib "advapi32" Alias "SetServiceStatus" (ByVal hServiceStatus&, lpServiceStatus As SERVICE_STATUS)

Declare Function SetServiceStatus Lib "advapi32" Alias "SetServiceStatus" (ByVal hServiceStatus As Long, lpServiceStatus As SERVICE_STATUS) As Long

呼び出し側サービスに関するサービス制御マネージャのステータス情報を更新する。

パラメータ
hServiceStatus
[入力]現在のサービスに対応するステータス情報構造体のハンドルを指定する。RegisterServiceCtrlHandler 関数が返したハンドルを指定する。
lpServiceStatus
[入力]呼び出し側サービスに関する最新ステータス情報を格納する 構造体へのポインタを指定する。

戻り値
関数が成功すると、0 以外の値が返る
関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。
サービス制御マネージャは次のエラーコードを設定することがある。サービス制御マネージャが呼び出したレジストリ関数は、その他のエラーコードを設定することがある。

    エラーコード                              

意味                                                                                                                    

    ERROR_INVALID_HANDLE

指定されたハンドルは無効である。

    ERROR_INVALID_DATA

指定されたサービスステータス構造体は無効である。

 

解説
    ServiceMain 関数は最初に RegisterServiceCtrlHandler 関数を呼び出して、サービスに対応する SERVICE_STATUS_HANDLE を取]

    得する。次いで、即座に SetServiceStatus 関数を呼び出し、自らの SERVICE_START_PENDING ステータスをサービス制御マネージャ

    へ通知する。
    サービスが制御の要求を受け取ると、たとえそのサービスのステータスが変化していない場合でも、そのサービスの Handler 関数は

    SetServiceStatus 関数を呼び出さなければならない。サービスはいつでも自らの任意のスレッドからこの Handler 関数を使って、ステータス

    が変化したことをサービス制御マネージャへ通知することもできる。ステータスの更新として望ましくないのは、次のような場合である。
        •サービスがある状態から別の状態へ遷移する過程で(つまり SERVICE_START_PENDING)チェックポイントの更新が発生する場合。
        •回復不可能なエラーが生じたためにサービスを停止しなければならなくなったときに、致命的なエラーに起因する更新が発生する場合。
    サービスは SetServiceStatus 関数を呼び出す前に、RegisterServiceCtrlHandler 関数を呼び出してサービスステータスのハンドルを取得し

    なければならない。