<Return[S]><Top>

StartService

Declare Function Api_StartService& Lib "advapi32" Alias "StartServiceA" (ByVal hService&, ByVal dwNumServiceArgs&, ByVal lpServiceArgVectors&)

Declare Function StartService Lib "advapi32" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As Long

サービスを開始する。

パラメータ
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 関数を呼び出すことができる。