次の方法で共有


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

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

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

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

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

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

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

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