StartServiceA 関数 (winsvc.h)
サービスを開始します。
構文
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
パラメーター
[in] hService
サービスへのハンドル。 このハンドルは OpenService 関数または CreateService 関数によって返され、SERVICE_STARTアクセス権が必要です。 詳細については、「 サービス セキュリティとアクセス権」を参照してください。
[in] dwNumServiceArgs
lpServiceArgVectors 配列内の文字列の数。 lpServiceArgVectors が NULL の場合、このパラメーターは 0 にすることができます。
[in, optional] lpServiceArgVectors
引数として サービスの ServiceMain 関数に渡される null で終わる文字列。 引数がない場合、このパラメーターは NULL にすることができます。 それ以外の場合、最初の引数 (lpServiceArgVectors[0]) はサービスの名前であり、その後に追加の引数 (lpServiceArgVectors[1] から lpServiceArgVectors[dwNumServiceArgs-1]) が続きます。
ドライバー サービスは、これらの引数を受け取りません。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
次のエラー コードは、サービス コントロール マネージャーによって設定できます。 その他は、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定できます。
リターン コード | 説明 |
---|---|
|
ハンドルにSERVICE_STARTアクセス権がありません。 |
|
ハンドルが正しくありません。 |
|
サービス バイナリ ファイルが見つかりませんでした。 |
|
サービスのインスタンスが既に実行されています。 |
|
データベースがロックされています。 |
|
このサービスは、存在しないサービスまたは削除対象としてマークされているサービスによって異なります。 |
|
サービスは、開始に失敗した別のサービスによって異なります。 |
|
サービスが無効になっています。 |
|
このサービスはログインの失敗が原因で、起動できませんでした。 このエラーは、"サービスとしてログオン" 権限を持たないアカウントでサービスが実行されるように構成されている場合に発生します。 |
|
サービスは削除対象としてマークされています。 |
|
サービスに対してスレッドを作成できませんでした。 |
|
サービスのプロセスは開始されましたが、 StartServiceCtrlDispatcher を呼び出さなかったか、 StartServiceCtrlDispatcher を呼び出したスレッドがコントロール ハンドラー関数でブロックされる可能性があります。 |
解説
ドライバー サービスが開始されると、デバイス ドライバーの初期化が完了するまで 、StartService 関数はを返しません。
サービスが開始されると、必要に応じてサービス コントロール マネージャー (SCM) によってサービス プロセスが生成されます。 指定されたサービスが他のサービスとプロセスを共有している場合は、必要なプロセスが既に存在している可能性があります。 StartService 関数は、新しいサービスからの最初の状態の更新を待機しません。しばらく時間がかかる場合があるためです。 代わりに、SCM がサービス コントロール ディスパッチャーから、このサービスの ServiceMain スレッドが正常に作成されたことを示す通知を受け取ったときにを返します。
SCM は 、StartService から戻る前に、次の既定の状態値を設定します。
- サービスの現在の状態は SERVICE_START_PENDING に設定されます。
- 受け入れられるコントロールは none (ゼロ) に設定されます。
- CheckPoint の値は 0 に設定されます。
- WaitHint 時間は 2 秒に設定されます。
初期化中、サービスは StartService を 呼び出すことができません。 その理由は、SCM が初期化中にサービス 制御データベースをロックするため、 StartService の呼び出しがブロックされるためです。 サービスは、正常に開始されたことを SCM に報告した後、 StartService を呼び出すことができます。
ControlService と同様に、いずれかのサービスがコントロール コードの処理にビジー状態になっている場合、StartService は 30 秒間ブロックします。 タイムアウトが切れたときにビジー状態のサービスがハンドラー関数からまだ返されない場合、 StartService はERROR_SERVICE_REQUEST_TIMEOUTで失敗します。 これは、SCM が一度に処理するサービス制御通知が 1 つだけであるためです。
例
例については、「 サービスの開始」を参照してください。
注意
winsvc.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして StartService を定義します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | winsvc.h (Windows.h を含む) |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |