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 を呼び出します。

次のエラー コードは、サービス コントロール マネージャーによって設定できます。 その他は、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定できます。

リターン コード 説明
ERROR_ACCESS_DENIED
ハンドルにSERVICE_STARTアクセス権がありません。
ERROR_INVALID_HANDLE
ハンドルが正しくありません。
ERROR_PATH_NOT_FOUND
サービス バイナリ ファイルが見つかりませんでした。
ERROR_SERVICE_ALREADY_RUNNING
サービスのインスタンスが既に実行されています。
ERROR_SERVICE_DATABASE_LOCKED
データベースがロックされています。
ERROR_SERVICE_DEPENDENCY_DELETED
このサービスは、存在しないサービスまたは削除対象としてマークされているサービスによって異なります。
ERROR_SERVICE_DEPENDENCY_FAIL
サービスは、開始に失敗した別のサービスによって異なります。
ERROR_SERVICE_DISABLED
サービスが無効になっています。
ERROR_SERVICE_LOGON_FAILED
このサービスはログインの失敗が原因で、起動できませんでした。 このエラーは、"サービスとしてログオン" 権限を持たないアカウントでサービスが実行されるように構成されている場合に発生します。
ERROR_SERVICE_MARKED_FOR_DELETE
サービスは削除対象としてマークされています。
ERROR_SERVICE_NO_THREAD
サービスに対してスレッドを作成できませんでした。
ERROR_SERVICE_REQUEST_TIMEOUT
サービスのプロセスは開始されましたが、 StartServiceCtrlDispatcher を呼び出さなかったか、 StartServiceCtrlDispatcher を呼び出したスレッドがコントロール ハンドラー関数でブロックされる可能性があります。

解説

ドライバー サービスが開始されると、デバイス ドライバーの初期化が完了するまで 、StartService 関数はを返しません。

サービスが開始されると、必要に応じてサービス コントロール マネージャー (SCM) によってサービス プロセスが生成されます。 指定されたサービスが他のサービスとプロセスを共有している場合は、必要なプロセスが既に存在している可能性があります。 StartService 関数は、新しいサービスからの最初の状態の更新を待機しません。しばらく時間がかかる場合があるためです。 代わりに、SCM がサービス コントロール ディスパッチャーから、このサービスの ServiceMain スレッドが正常に作成されたことを示す通知を受け取ったときにを返します。

SCM は 、StartService から戻る前に、次の既定の状態値を設定します。

  • サービスの現在の状態は SERVICE_START_PENDING に設定されます。
  • 受け入れられるコントロールは none (ゼロ) に設定されます。
  • CheckPoint の値は 0 に設定されます。
  • WaitHint 時間は 2 秒に設定されます。
呼び出し元のプロセスでは、 QueryServiceStatus 関数を定期的に呼び出してサービスの状態を照会することで、新しいサービスの初期化が完了したかどうかを判断できます。

初期化中、サービスは 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

関連項目

ControlService

CreateService

DeleteService

OpenService

QueryServiceDynamicInformation

QueryServiceStatusEx

サービス関数

サービスの起動

ServiceMain