<Return[C]><Top>

ControlService

Declare Function Api_ControlService& Lib "advapi32" Alias "ControlService" (ByVal hService&, ByVal dwControl&, lpServiceStatus As SERVICE_STATUS)

Declare Function ControlService Lib "advapi32" Alias "ControlService" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long

制御コードをサービスアプリケーションへ送信する。

パラメータ
hService
    [入力]サービスのハンドルを指定する。これには OpenService 関数または CreateService 関数が返したハンドルを使うが、このハンドル

    に必要なアクセス権は、dwControl パラメータに指定する制御コードによって異なる。
dwControl
    [入力]要求する制御コードを指定する。次の制御コードのいずれかを指定する。

    制御コード                                                    

意味                                                                                                       

    SERVICE_CONTROL_STOP

 

サービスを停止するよう要求する。hService パラメータに指定したハンドルには、SERVICE_STOP アクセス権が必要である。

    SERVICE_CONTROL_PAUSE

 

サービスを一時停止するよう要求する。hService パラメータに指定したハンドルには、SERVICE_PAUSE_CONTINUE アクセス権が必要である

    SERVICE_CONTROL_CONTINUE

 

一時停止されているサービスを再開するよう要求する。hService パラメータに指定したハンドルには、SERVICE_PAUSE_CONTINUE アクセス権が必要である。

    SERVICE_CONTROL_INTERROGATE

 

 

サービスが自らの現在のステータス情報をサービス制御マネージャへ伝えて、情報を更新するよう要求する。hService パラメータに指定したハンドルには、SERVICE_INTERROGATE アクセス権が必要である。

    SERVICE_CONTROL_PARAMCHANGE

 

 

Windows 2000:サービスが自らの起動パラメータを再度読み込むよう要求する。hService パラメータに指定したハンドルには、SERVICE_PAUSE_CONTINUE アクセス権が必要である。

    SERVICE_CONTROL_NETBINDCHANGE

 

 

Windows 2000:サービスが自らのネットワークバインディングを更新するよう要求する。hService パラメータに指定したハンドルには、SERVICE_PAUSE_CONTINUE アクセス権が必要である。

    この値は、次の表に示すユーザー定義の制御コードであってもかまわない。

    制御コード             

意味                                                                                                                                            

    128〜255 の範囲

 

サービスは、制御コードに関連付けられる操作を定義する。hService パラメータに指定したハンドルには、SERVICE_USER_DEFINED_CONTROL アクセス権が必要である。

lpServiceStatus
    [出力] 最新のサービスステータス情報を受け取る 構造体へのポインタを指定する。返されるこの情報は、サービスがサービス制御マネ

    ージャへ報告した最新のステータスを反映している。
    ControlService 関数が NO_ERROR、ERROR_INVALID_SERVICE_CONTROL、

    ERROR_SERVICE_CANNOT_ACCEPT_CONTROL、ERROR_SERVICE_NOT_ACTIVE のいずれかのエラーコードを返した場合の

    み、サービス制御マネージャはこの構造体に情報を書き込む。それ以外の場合、この構造体に情報を書き込まない。

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

    コードを設定することがある。

    エラーコード                                                        

意味                                                                                                   

    ERROR_ACCESS_DENIED

指定されたハンドルを開く際に、必要なアクセス権が指定されていなかった。

    ERROR_DEPENDENT_SERVICES_RUNNING

 

動作中の他のサービスがこのサービスに依存しているので、このサービスを停止できない。

    ERROR_INVALID_HANDLE

 

指定されたハンドルは CreateService 関数または OpenService 関数が返したものではない。または、有効ではない。

    ERROR_INVALID_PARAMETER

要求された制御コードは未定義である。

    ERROR_INVALID_SERVICE_CONTROL

要求された制御コードは無効、またはこのサービスにとって受け入れ不可能である。

    ERROR_SERVICE_CANNOT_ACCEPT_CTRL

 

 

サービスの状態が SERVICE_STOPPED、SERVICE_START_PENDING、SERVICE_STOP_PENDING のいずれかであるため、要求された制御コードをこのサービスへ送信できない。

    ERROR_SERVICE_NOT_ACTIVE

このサービスはまだ開始されていない。

    ERROR_SERVICE_REQUEST_TIMEOUT

 

 

サービス用のプロセスはすでに開始されているが、このプロセスはまだ StartServiceCtrlDispatcher 関数を呼び出していないか、StartServiceCtrlDispatcher 関数を呼び出したスレッドが制御ハンドラ関数によって妨害されている。

    ERROR_SHUTDOWN_IN_PROGRESS

システムをシャットダウン中である。


解説
    ControlService 関数は、要求した制御コードをサービスへ送信するようサービス制御マネージャに指示する。サービスがこの制御コードを受

    け入れることが可能であり、かつ制御コードをサービスへ送信することが可能な場合、サービス制御マネージャはこのコードを送信する。セキ

    ュリティ記述子によって認められていない限り、開発者はサービスを停止または開始できない。既定のセキュリティ記述子は、

    LocalSystem、Administrators、Power Users のそれぞれに、サービスの停止と終了を認めている。サービスのセキュリティ記述子を変更

    するには、 関数を使う。
    QueryServiceStatus 関数は 構造体を返すが、この構造体の dwCurrentState メンバと dwControlsAccepted メンバは、動作中のサービ

    スの現在の状態と、受け入れ可能な制御コードを示す。動作中のすべてのサービスは、既定で SERVICE_CONTROL_INTERROGATE

    制御コードを受け入れる。ドライバは、SERVICE_CONTROL_STOP と SERVICE_CONTROL_INTERROGATE 以外の制御コードを受

    け入れない。各サービスは、SetServiceStatus 関数を呼び出して自らのステータスを報告する際に、受け入れ可能な他の制御コードを指

    定する。サービスは動作している最中は、これらのコードが何を行うかにかかわりなく、これらのコードを必ず受け入れなくてはならない。
    次の表に、サービスが取り得る各状態において、サービス制御マネージャが実施する操作を要約する。

    サービスの状態                 

停止

他の制御コード                                                                                                             

    STOPPED

(c)

(c)

    STOP_PENDING

(b)

(b)

    START_PENDING

(a)

(a)

    RUNNING

(a)

(a)

    CONTINUE_PENDING

(a)

(a)

    PAUSE_PENDING

(a)

(a)

    PAUSED

(a)

(a)

   

(a)

サービスがこの制御コードを受け入れる場合、要求をサービスへ送信する。それ以外の場合、ControlService 関数は 0 を返し、GetLastError 関数は ERROR_INVALID_SERVICE_CONTROL を返す。

   

(b)

サービスはこの制御コードを送信できる状態ではない。そのため、ControlService 関数は 0 を返し、GetLastError 関数は ERROR_SERVICE_CANNOT_ACCEPT_CTRL を返す。

   

(c)

サービスはアクティブではない。そのため、ControlService 関数は 0 を返し、GetLastError 関数は ERROR_SERVICE_NOT_ACTIVE を返す。