パラメータ
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 を返す。 |
|