ControlServiceExA 関数 (winsvc.h)
コントロール コードをサービスに送信します。
構文
BOOL ControlServiceExA(
[in] SC_HANDLE hService,
[in] DWORD dwControl,
[in] DWORD dwInfoLevel,
[in, out] PVOID pControlParams
);
パラメーター
[in] hService
サービスへのハンドル。 このハンドルは、 OpenService または CreateService 関数によって返されます。 このハンドルに必要な アクセス権 は、要求された dwControl コードによって異なります。
[in] dwControl
このパラメーターには、次のいずれかの制御コードを指定できます。
このパラメーターは、次の表で説明するように、ユーザー定義のコントロール コードにすることもできます。
制御コード | 説明 |
---|---|
|
サービスは、コントロール コードに関連付けられているアクションを定義します。 hService ハンドルには、SERVICE_USER_DEFINED_CONTROLアクセス権が必要です。 |
[in] dwInfoLevel
サービス 制御パラメーターの情報レベル。 このパラメーターは、SERVICE_CONTROL_STATUS_REASON_INFO (1) に設定する必要があります。
[in, out] pControlParams
サービス 制御パラメーターへのポインター。 dwInfoLevel がSERVICE_CONTROL_STATUS_REASON_INFO場合、このメンバーはSERVICE_CONTROL_STATUS_REASON_PARAMS構造体へのポインターです。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
次のエラー コードは、サービス コントロール マネージャーによって設定できます。 その他のエラー コードは、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定できます。
リターン コード | 説明 |
---|---|
|
ハンドルに必要なアクセス権がありません。 |
|
実行中の他のサービスがそれに依存しているため、サービスを停止できません。 |
|
指定したハンドルが CreateService または OpenService を使用して取得されなかったか、ハンドルが無効になりました。 |
|
dwControl パラメーターで要求されたコントロール コードが未定義であるか、dwControl がSERVICE_CONTROL_STOPが、SERVICE_CONTROL_STATUS_REASON_PARAMS構造体の dwReason または pszComment メンバーが無効です。 |
|
要求された制御コードは有効でないか、またはサービスを受け入れ可能ではありません。 |
|
サービスの状態がSERVICE_STOPPED、SERVICE_START_PENDING、またはSERVICE_STOP_PENDINGであるため、要求された制御コードをサービスに送信できません。 |
|
サービスは開始されていません。 |
|
サービスのプロセスは開始されましたが、 StartServiceCtrlDispatcher を呼び出さなかったか、 StartServiceCtrlDispatcher を呼び出したスレッドがコントロール ハンドラー関数でブロックされる可能性があります。 |
|
システムがシャットダウンしています。 |
解説
ControlServiceEx 関数は、要求されたコントロール コードをサービスに送信するようにサービス コントロール マネージャー (SCM) に要求します。 SCM は、サービスがコードを受け入れることを指定し、コントロール コードを送信できる状態である場合にコードを送信します。
SCM は、サービス制御通知をシリアル形式で処理します。1 つのサービスがサービス制御通知の処理を完了してから、次のサービス制御通知を送信するまで待機します。 このため、コントロール コードの処理がビジー状態のサービスがある場合、 ControlServiceEx の呼び出しは 30 秒間ブロックされます。 タイムアウトが切れたときにビジー状態のサービスがハンドラー関数からまだ返されない場合、 ControlServiceEx はERROR_SERVICE_REQUEST_TIMEOUTで失敗します。
サービスを停止して開始するには、それを可能にするセキュリティ記述子が必要です。 既定のセキュリティ記述子を使用すると、 LocalSystem アカウントと、Administrators グループと Power Users グループのメンバーがサービスを停止および開始できます。 サービスのセキュリティ記述子を変更するには、「サービスの DACL の変更」を参照してください。
QueryServiceStatusEx 関数は、dwCurrentState メンバーと dwControlsAccepted メンバーが現在の状態を示し、実行中のサービスによって受け入れられるコントロールを持つSERVICE_STATUS_PROCESS構造体を返します。 実行中のすべてのサービスは、既定でSERVICE_CONTROL_INTERROGATEコントロール コードを受け入れます。 ドライバーは、SERVICE_CONTROL_STOPとSERVICE_CONTROL_INTERROGATE以外のコントロール コードを受け入れられません。 各サービスは、 SetServiceStatus 関数を呼び出して状態を報告するときに受け入れる他のコントロール コードを指定します。 サービスは、何を行っていても、実行中は常にこれらのコードを受け入れる必要があります。
次の表は、使用可能な各サービス状態における SCM のアクションを示しています。
サービスの状態 | Stop | その他の制御 |
---|---|---|
STOPPED | (c) | (c) |
STOP_PENDING | (b) | (b) |
START_PENDING | (a) | (b) |
RUNNING | (a) | (a) |
CONTINUE_PENDING | (a) | (a) |
PAUSE_PENDING | (a) | (a) |
PAUSED | (a) | (a) |
- (a)
- サービスがこの制御コードを受け入れる場合は、サービスに要求を送信します。それ以外の場合、ControlServiceEx は 0 を返し、GetLastError はERROR_INVALID_SERVICE_CONTROLを返します。
- (b)
- このサービスはコントロールに送信できる状態ではありません。そのため、ControlServiceEx は 0 を返し、GetLastError はERROR_SERVICE_CANNOT_ACCEPT_CTRLを返します。
- (c)
- サービスはアクティブでないので、ControlServiceEx は 0 を返し、GetLastError はERROR_SERVICE_NOT_ACTIVEを返します。
注意
winsvc.h ヘッダーは、ControlServiceEx をエイリアスとして定義し、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | winsvc.h (Windows.h を含む) |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |