Delphi を使用して Win2000 サービス プログラムを作成する
要約: この記事では、Delphi を使用して Win2000 サービス プログラムを作成する方法を紹介します。関連するクラスは、TServiceApplicatoin、TService、TServiceThread などです。
キーワード: サービス/サービス
1. Win2000 サービスの概要
サービス アプリケーションは、WinNT 上で実行されるバックグラウンド プログラムです。各サービス アプリケーションには複数のサービスが含まれており、各サービスはスレッドの 1 つです (サービスは複数のサブサービス スレッドを作成することもできます)。サービスを使用すると、アプリケーションは特別なアクセス許可を取得でき、ユーザーが Win2000 タスク マネージャを介してプログラムを直接終了する必要がないため、サービスは特別な目的を達成するためによく使用されます。
Win2000 コントロール パネルのサービス管理ツールを使用して、サービスの特性を設定/表示できます。
(1) サービス名、(2) 表示名、(4) スタートアップの種類、(5) 依存関係。
このうち、サービス名はサービスを識別します。
Win2000 の C:/WINNT/System32/services.exe プログラムを例に挙げます。この Exe ファイルはサービス アプリケーションに対応しており、Alerter などの複数のサービス (サービス) が含まれています。 DHCP(DHCP)クライアント)、メッセンジャーなどサービスを終了しても、そのサービスが存在するサービス アプリケーション内の他のサービスは終了しません。
Delphi では、ボーランドのエンジニアが TServiceApplication、TService、TServiceThread およびその他のクラスを提供します。これらのクラスは、多数の詳細をカプセル化し、サービス プログラムの開発を簡素化します。
2.Tサービスアプリケーション
Delphi では、TServiceApplication クラスが上記の ServiceApplication に相当します。 Delphi 開発環境を使用して、新しいサービス アプリケーション PROject を作成し、TService から継承したクラスを作成します。プロジェクト ファイル内の Application オブジェクトは TServiceApplication インスタンスです。各 TServiceApplication には複数の TService オブジェクトが含まれており、これらは前述のサービス プログラムとサービス間の定量的な関係に正確に対応します。
TServiceApplication クラスと TService クラスの定義を読むと、TServiceApplication が TComponent クラスから継承され、TService が TDataModule クラスから来ており、Application オブジェクトが各 TService オブジェクトの作成と破棄を担当していることがわかります。次のコードを追跡します
Application.CreateForm(TService1, Service1);
作成された TService オブジェクトの所有者はすべて Application オブジェクトであることがわかります。VCL FrameWork では、Owner は常に各 Component オブジェクトを破棄する責任を負います (VCL の TComponent クラスは Composite モードを採用しています)。そのため、TServiceApplication も各 TService オブジェクトを破棄します。
TServiceApplication.Run のコードをたどると、TServiceApplication が最初に実行パラメータを解析し、サービスのインストールとアンインストールを実装していることがわかります。次に、各サービス オブジェクトのサービス名と実行中のエントリを含む ServiceStartTable 配列を初期化します。最後に、スレッド オブジェクトである TServiceStartThread オブジェクトを作成し、スレッドから API: StartServiceCtrlDispatcher を呼び出して、ServiceStartTable で指定されたいくつかのサービスを開始します。 ServiceApplication のメイン スレッドはループを続けて、サービスの停止/一時停止リクエストの受信などのメッセージを処理します。
3.Tサービス
TService クラスは TDataModule クラスを継承しています。これは、豊富な機能を実現するために多数の VCL コントロールを追加できることを意味します。さらに、OnStart、OnPause、OnStop、OnContinue、OnCreate、OnShutDown などのイベントも処理できます。説明する必要があるのは、OnStop はサービスが停止したことを意味し、OnShutDown は ServiceApplication が実行を停止したことを意味し、この 2 つの意味は異なります。
前述したように、ServiceApplication は StartServiceCtrlDispatcher を呼び出して各サービスを開始します。 StartServiceCtrlDispatcher は、TService の入り口 (TService.Main) を開始します。 TService.Main は最初にサービスを登録し、次に TService.DoStart を呼び出します。 TService.DoStart は、スレッド オブジェクトである内部 TServiceThread メンバー オブジェクトを作成します。TServiceThread.Execute を調べると、TService1.OnExecute を処理するときに、TService がすべてのリクエストを処理のために TServiceThread メンバー オブジェクトに委任することがわかります。デフォルトのメソッドはすべてのリクエストを処理します。
TService.ServiceExecute は TService のメイン コンテンツです。サービスが正常に実行されるためには、集中する必要がある目標 (特定のポートのリッスン、特定のタスクの実行など) に対処することに加えて、次のような外部コマンド/リクエストに応答する必要もあります。サービスの終了、一時停止、再開。したがって、このタスクを完了し、ServiceExecute で外部コマンド/リクエストを処理するための専用スレッドを作成することを検討できます。したがって、コードは次のようになります。
終了していない間は開始します
ServiceThread.ProcessRequests(False);
終わり;
もちろん、特定のポートをリッスンするなど、OnExecute で特定のタスクを処理することもできますが、これによりサービスが停止/一時停止やその他のリクエストにタイムリーに応答できなくなることがよくあります。 OnExecute が完了すると、サービスは実際にタスクを完了し、まさに終了 (終了) しようとしています。
参考文献:
MSDN、Delphi VCL ソース コード、Delphi ヘルプ ドキュメント