次の方法で共有


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

サービスは通常、コンソール アプリケーションとして記述されます。 コンソール アプリケーションのエントリ ポイントは、メインの 関数です。 main 関数は、サービスのレジストリ キーから ImagePath 値から引数を受け取ります。 詳細については、CreateService 関数の「解説」セクションを参照してください。

SCM は、サービス プログラムを開始するときに、StartServiceCtrlDispatcher 関数を呼び出すのを待機します。 次のガイドラインを使用します。

  • SERVICE_WIN32_OWN_PROCESS型のサービスは、メイン スレッドから直ちに StartServiceCtrlDispatcher呼び出す必要があります。 ServiceMain 関数の で説明されているように、サービスの開始後に初期化実行できます。
  • サービスの種類がSERVICE_WIN32_SHARE_PROCESSで、プログラム内のすべてのサービスに共通の初期化がある場合は、30 秒未満で StartServiceCtrlDispatcher呼び出す前に、メイン スレッドで初期化を実行できます。 それ以外の場合は、共通の初期化を行うために別のスレッドを作成する必要があります。メイン スレッドは StartServiceCtrlDispatcher 呼び出します。 サービスの開始後も、サービス固有の初期化を実行する必要があります。

StartServiceCtrlDispatcher 関数は、プロセスに含まれる各サービスの SERVICE_TABLE_ENTRY 構造体を受け取ります。 各構造体は、サービス名とサービスのエントリ ポイントを指定します。 例については、「サービス プログラムのメイン関数 を記述するを参照してください。

StartServiceCtrlDispatcher成功した場合、プロセス内のすべての実行中のサービスがSERVICE_STOPPED状態になるまで、呼び出し元のスレッドは戻りません。 SCM は、名前付きパイプを介してこのスレッドに制御要求を送信します。 スレッドはコントロール ディスパッチャーとして機能し、次のタスクを実行します。

  • 新しいサービスが開始されたときに適切なエントリ ポイントを呼び出す新しいスレッドを作成します。
  • 適切な ハンドラー関数 を呼び出して、サービス制御要求を処理します。

サービス プログラムのメイン関数の作成