あるので、Delphiでできるかどうか調べてみた。
Delphi PrismではdotNetFreameworkに標準で用意されたクラスが使えるので
簡単だが、Delphi(Win32)では用意されていないみたいだ。
さらに調べたところ、Jedi Code Library(Jcl)には、サービスを扱うクラス
(TJclSCManager,TJclNTService)が用意されていることを知ったので、
実際に検証してみた。
以下、検証用に作ったサンプル(サービスの列挙と指定したサービスの
停止と起動)です。
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- ListBox1: TListBox;
- LabeledEdit1: TLabeledEdit;
- Button2: TButton;
- Button3: TButton;
- Label1: TLabel;
- procedure Button1Click(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- procedure ListBox1Click(Sender: TObject);
- private
- { Private 宣言 }
- public
- { Public 宣言 }
- end;
- var
- Form1: TForm1;
- implementation
- uses
- JclSvcCtrl
- , TypInfo
- ;
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- var
- SvcMgr : TJclSCManager;
- i : Integer;
- begin
- //
- SvcMgr := TJclSCManager.Create();
- try
- SvcMgr.Refresh(true);
- ListBox1.Clear;
- for i := 0 to SvcMgr.ServiceCount -1 do
- begin
- ListBox1.Items.Add(SvcMgr.Services[i].ServiceName);
- end;
- finally
- SvcMgr.Free;
- end;
- end;
- procedure TForm1.Button3Click(Sender: TObject);
- var
- SvcMgr : TJclSCManager;
- Svc : TJclNTService;
- begin
- //
- //if True then
- SvcMgr := TJclSCManager.Create();
- try
- SvcMgr.Refresh(true);
- if (SvcMgr.FindService(LabeledEdit1.Text,Svc)) Then
- begin
- if TComponent(Sender).Tag = 1 then
- begin
- Svc.Start;
- end
- else
- begin
- Svc.Stop;
- end;
- Label1.Caption := GetEnumName(TypeInfo(TJclServiceState),Ord(Svc.ServiceState)) ;
- end;
- finally
- SvcMgr.Free;
- end;
- end;
- procedure TForm1.ListBox1Click(Sender: TObject);
- var
- SvcMgr : TJclSCManager;
- Svc : TJclNTService;
- begin
- if ListBox1.ItemIndex >=0 then
- begin
- LabeledEdit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];
- SvcMgr := TJclSCManager.Create();
- try
- SvcMgr.Refresh(true);
- if (SvcMgr.FindService(LabeledEdit1.Text,Svc)) Then
- begin
- Label1.Caption := GetEnumName(TypeInfo(TJclServiceState),Ord(Svc.ServiceState));
- end;
- finally
- SvcMgr.Free;
- end;
- end;
- end;
- end.
なお、jclには上記クラスを使用したサンプルプログラムがありますので詳細については
そちらを参照して下さい。
1 件のコメント:
こんにちは、通りすがりのDelphiユーザーです。
JEDIのライブラリは私も愛用しています。
機能がありすぎて使い切れていないですが、何かいいものないかなと探すのも
楽しみですね。
コメントを投稿