次の方法で共有


StartServiceCtrlDispatcherA 関数 (winsvc.h)

サービス プロセスのメイン スレッドをサービス コントロール マネージャーに接続します。これにより、スレッドが呼び出し元プロセスのサービス コントロール ディスパッチャー スレッドになります。

構文

BOOL StartServiceCtrlDispatcherA(
  [in] const SERVICE_TABLE_ENTRYA *lpServiceStartTable
);

パラメーター

[in] lpServiceStartTable

呼び出し元のプロセスで実行できるサービスごとに 1 つのエントリを含む SERVICE_TABLE_ENTRY 構造体の配列へのポインター。 テーブルの最後のエントリのメンバーには、テーブルの末尾を指定する NULL 値が必要です。

戻り値

関数が成功した場合、戻り値は 0 以外です。

関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。

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

リターン コード 形容
ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
このエラーは、プログラムがサービスとしてではなくコンソール アプリケーションとして実行されている場合に返されます。

デバッグ目的でプログラムをコンソール アプリケーションとして実行する場合は、このエラーが返されるときにサービス固有のコードが呼び出されないように構成します。

ERROR_INVALID_DATA
指定されたディスパッチ テーブルには、適切な形式ではないエントリが含まれています。
ERROR_SERVICE_ALREADY_RUNNING
このプロセスでは、startServiceCtrlDispatcherが既に呼び出されています。 各プロセスは、StartServiceCtrlDispatcher 1 回だけ呼び出すことができます。

備考

サービス コントロール マネージャーは、サービス プロセスを開始すると、プロセスが StartServiceCtrlDispatcher 関数を呼び出すのを待機します。 サービス プロセスのメイン スレッドは、起動後 (30 秒以内) にできるだけ早くこの呼び出しを行う必要があります。 StartServiceCtrlDispatcher 成功すると、呼び出し元のスレッドがサービス コントロール マネージャーに接続され、プロセス内のすべての実行中のサービスがSERVICE_STOPPED状態になるまで戻りません。 サービス コントロール マネージャーは、この接続を使用して、サービス プロセスのメイン スレッドにコントロールとサービスの開始要求を送信します。 メイン スレッドは、適切な HandlerEx 関数を呼び出して制御要求を処理するか、新しいサービスの開始時に適切な ServiceMain 関数を実行する新しいスレッドを作成することによって、ディスパッチャーとして機能します。

lpServiceTable パラメーターには、呼び出し元プロセスで実行できる各サービスのエントリが含まれています。 各エントリは、そのサービス ServiceMain 関数を指定します。 SERVICE_WIN32_SHARE_PROCESS サービスの場合、各エントリにはサービスの名前が含まれている必要があります。 この名前は、サービスのインストール時に CreateService 関数によって指定されたサービス名です。 SERVICE_WIN32_OWN_PROCESS サービスの場合、テーブル エントリ内のサービス名は無視されます。

サービスが独自のプロセスで実行されている場合、サービス プロセスのメイン スレッドは直ちに StartServiceCtrlDispatcher呼び出す必要があります。 初期化タスクはすべて、サービスの起動時にサービスの ServiceMain 関数で実行されます。

複数のサービスがプロセスを共有し、ServiceMain 関数を呼び出す前に一般的なプロセス全体の初期化を行う必要がある場合、メイン スレッドは、StartServiceCtrlDispatcherを呼び出す前に、30 秒未満で作業を実行できます。 それ以外の場合は、プロセス全体の初期化を行うために別のスレッドを作成する必要があります。メイン スレッドは StartServiceCtrlDispatcher 呼び出し、サービス コントロール ディスパッチャーになります。 サービス固有の初期化は、個々のサービス メイン関数で引き続き実行する必要があります。

サービスは、ユーザー インターフェイスを直接表示しないでください。 詳細については、「対話型サービスの」を参照してください。

例については、サービス・プログラムのメイン機能の作成 を参照してください。

手記

winsvc.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして StartServiceCtrlDispatcher を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

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

関連項目

ControlService

HandlerEx

SERVICE_TABLE_ENTRY

サービス エントリ ポイントの

サービス関数の

ServiceMain の