次の方法で共有


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 を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsvc.h (Windows.h を含む)
ライブラリ Advapi32.lib
DLL Advapi32.dll

関連項目

ControlService

CreateService の

DeleteService の

OpenService

QueryServiceDynamicInformation の

QueryServiceStatusEx

サービス関数の

サービスのスタートアップ

ServiceMain の