パラメータ
hService
[入力]サービスのハンドルを指定する。OpenService 関数または CreateService
関数が返したハンドルを指定し、これには
SERVICE_START アクセス権が必要である。
dwNumServiceArgs
[入力]lpServiceArgVectors
パラメータが指す配列内の引数文字列の数を指定する。lpServiceArgVectors パラメータが NULL の場
合、dwNumServiceArgs パラメータは 0 でもかまわない。
lpServiceArgVectors
[入力]NULL
で終わる引数文字列へのポインタからなる配列へのポインタを指定する。これらの引数文字列はサービスへ渡され、ドライ
バサービスはこれらの引数を受け取らない。サービスを開始しようとする際に引数を渡さない場合は、このパラメータは NULL でもかまわな
い。サービスは自らの ServiceMain 関数を通して、これらの引数にアクセスする。最初の引数(argv[0])は既定でサービスの名前であり、
それ以降に、lpServiceArgVectors パラメータが指す配列内の引数が続く。
戻り値
関数が成功すると、0 以外の値が返る。
関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。
サービス制御マネージャは次のエラーコードを設定することがある。サービス制御マネージャが呼び出したレジストリ関数は、その他のエラー
コードを設定することがある。
エラーコード
|
意味
|
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
|
このサービスはログオンできませんでした。"Log on as a
service"(サービスとしてログオン)のアクセス権がないアカウントを使ってサービスを開始すると、このエラーが発生する。 |
ERROR_SERVICE_MARKED_FOR_DELETE |
このサービスには削除用のマークが付いている。 |
ERROR_SERVICE_NO_THREAD |
このサービス用のスレッドを作成できなかった。 |
ERROR_SERVICE_REQUEST_TIMEOUT
|
このサービス用のプロセスを開始したが、そのプロセスが
StartServiceCtrlDispatcher 関数を呼び出さなかったか、StartServiceCtrlDispatcher
関数を呼び出したスレッドが制御ハンドラ関数内で妨害を受けた可能性がある。 |
解説
ドライバサービスを開始した場合、デバイスドライバの初期化が完了するまで StartService 関数は制御を戻さない。
サービスアプリケーションを開始した場合、サービス制御マネージャは必要に応じてサービスプロセスを作成する。指定されたサービスが 1 つ
のプロセスをほかのサービスと共有している場合、必要なプロセスがすでに存在している可能性がある。StartService 関数は、新しいサー
ビスが最初のステータス更新を行うのを待たない。この更新が発生するまで多少の時間がかかるからである。代わりに、サービス制御マネ
ージャが、このサービス用の ServiceMain
スレッドの作成に成功したという通知をサービス制御ディスパッチャから受け取った時点で、
StartService 関数は制御を戻す。
サービス制御マネージャは StartService 関数から制御を戻す前に、次の既定のステータス値を設定する。
•サービスの現在の状態を SERVICE_START_PENDING
に設定する。
•受け取った制御をクリアします(0 に設定する)。
•CheckPoint 値を 0 に設定する。
•WaitHint 時間を 2 秒に設定する。
呼び出し側プロセスは、QueryServiceStatus
関数を周期的に呼び出してサービスのステータスを問い合わせることにより、新しいサービス
の初期化が終わったかどうかを判断できる。
サービスは初期化を行っている間は StartService
関数を呼び出すことができない。サービス制御マネージャは初期化の間はサービス制御デ
ータベースをロックしているので、StartService 関数の呼び出しも妨害される。サービスの開始に成功したことをサービス制御マネージャへ通
知した後で、サービスは StartService
関数を呼び出すことができる。 |