2010年11月3日水曜日

サービスの起動と停止

現在、進行中の案件で、サービスの再起動を定期的に行う必要が
あるので、Delphiでできるかどうか調べてみた。

Delphi PrismではdotNetFreameworkに標準で用意されたクラスが使えるので
簡単だが、Delphi(Win32)では用意されていないみたいだ。

さらに調べたところ、Jedi Code Library(Jcl)には、サービスを扱うクラス
(TJclSCManager,TJclNTService)が用意されていることを知ったので、
実際に検証してみた。

以下、検証用に作ったサンプル(サービスの列挙と指定したサービスの
停止と起動)です。

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls, ExtCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     ListBox1: TListBox;  
  13.     LabeledEdit1: TLabeledEdit;  
  14.     Button2: TButton;  
  15.     Button3: TButton;  
  16.     Label1: TLabel;  
  17.     procedure Button1Click(Sender: TObject);  
  18.     procedure Button3Click(Sender: TObject);  
  19.     procedure ListBox1Click(Sender: TObject);  
  20.   private  
  21.     { Private 宣言 }  
  22.   public  
  23.     { Public 宣言 }  
  24.   end;  
  25.   
  26. var  
  27.   Form1: TForm1;  
  28.   
  29. implementation  
  30.   
  31. uses  
  32.     JclSvcCtrl  
  33.   , TypInfo  
  34.   ;  
  35.   
  36. {$R *.dfm}  
  37.   
  38. procedure TForm1.Button1Click(Sender: TObject);  
  39. var  
  40.   SvcMgr : TJclSCManager;  
  41.   i : Integer;  
  42. begin  
  43. //  
  44.   SvcMgr := TJclSCManager.Create();  
  45.   
  46.   try  
  47.     SvcMgr.Refresh(true);  
  48.     ListBox1.Clear;  
  49.     for i := 0 to SvcMgr.ServiceCount -1 do  
  50.     begin  
  51.       ListBox1.Items.Add(SvcMgr.Services[i].ServiceName);  
  52.     end;  
  53.   
  54.   
  55.   finally  
  56.     SvcMgr.Free;  
  57.   end;  
  58.   
  59. end;  
  60.   
  61. procedure TForm1.Button3Click(Sender: TObject);  
  62. var  
  63.   SvcMgr : TJclSCManager;  
  64.   Svc : TJclNTService;  
  65. begin  
  66. //  
  67.   //if True then  
  68.   SvcMgr := TJclSCManager.Create();  
  69.   try  
  70.     SvcMgr.Refresh(true);  
  71.     if (SvcMgr.FindService(LabeledEdit1.Text,Svc)) Then  
  72.     begin  
  73.       if TComponent(Sender).Tag = 1 then  
  74.       begin  
  75.         Svc.Start;  
  76.       end  
  77.       else  
  78.       begin  
  79.         Svc.Stop;  
  80.       end;  
  81.       Label1.Caption := GetEnumName(TypeInfo(TJclServiceState),Ord(Svc.ServiceState)) ;  
  82.     end;  
  83.   finally  
  84.     SvcMgr.Free;  
  85.   end;  
  86.   
  87.   
  88. end;  
  89.   
  90. procedure TForm1.ListBox1Click(Sender: TObject);  
  91. var  
  92.   SvcMgr : TJclSCManager;  
  93.   Svc : TJclNTService;  
  94. begin  
  95.   if ListBox1.ItemIndex >=0 then  
  96.   begin  
  97.     LabeledEdit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];  
  98.     SvcMgr := TJclSCManager.Create();  
  99.     try  
  100.       SvcMgr.Refresh(true);  
  101.       if (SvcMgr.FindService(LabeledEdit1.Text,Svc)) Then  
  102.       begin  
  103.         Label1.Caption := GetEnumName(TypeInfo(TJclServiceState),Ord(Svc.ServiceState));  
  104.       end;  
  105.     finally  
  106.       SvcMgr.Free;  
  107.     end;  
  108.   
  109.   end;  
  110.   
  111. end;  
  112.   
  113. end.  



なお、jclには上記クラスを使用したサンプルプログラムがありますので詳細については
そちらを参照して下さい。

1 件のコメント:

匿名 さんのコメント...

こんにちは、通りすがりのDelphiユーザーです。 
JEDIのライブラリは私も愛用しています。
機能がありすぎて使い切れていないですが、何かいいものないかなと探すのも
楽しみですね。