delphi之远程服务管理类模块

来源:互联网 发布:软件学院 编辑:程序博客网 时间:2024/05/20 08:44
unit UnitServiceManager;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, ScktComp, StdCtrls, Spin, umSFPack,zlib,ImageHLP,  UnitFileTransfer,Menus, ImgList, ToolWin, ComCtrls , Jpeg,  ClipBrd, UnitSharedData, shellapi,CommCtrl, UnitThumbDb, Buttons;type  TServiceManager = class(TForm)    StatusBar1: TStatusBar;    ImageList1: TImageList;    PopupMenu1: TPopupMenu;    Refresh1: TMenuItem;    N1: TMenuItem;    Edit1: TMenuItem;    Start1: TMenuItem;    Stop1: TMenuItem;    Install1: TMenuItem;    Remove1: TMenuItem;    ListView1: TListView;    Timer1: TTimer;    procedure Refresh1Click(Sender: TObject);    procedure Start1Click(Sender: TObject);    procedure Stop1Click(Sender: TObject);    procedure Remove1Click(Sender: TObject);    procedure ListView1CustomDrawItem(Sender: TCustomListView;      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);    procedure ListView1CustomDrawSubItem(Sender: TCustomListView;      Item: TListItem; SubItem: Integer; State: TCustomDrawState;      var DefaultDraw: Boolean);    procedure Edit1Click(Sender: TObject);    procedure Install1Click(Sender: TObject);    procedure Timer1Timer(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private    { Private declarations }  public    { Public declarations }    MainSocket: TCustomWinSocket;    NewSocket: TCustomWinSocket;    SocketData: TSocketData;    Group,Computer,User: string;    procedure ParseData(Socket: TCustomWinSocket; Data: string);    procedure SetUpConnection(Socket: TCustomWinSocket);  end;var  ServiceManager: TServiceManager;implementationuses UnitEditService, UnitCreateService;{$R *.dfm}procedure SendData(Socket: TCustomWinSocket; Data: string);begin  UnitSharedData.SendData(Socket,'ServiceManager|' + Data);end;procedure DisconnectProc(Socket: TCustomWinSocket);var  SocketData: TSocketData;begin  SocketData := TSocketData(Socket.Data);  TServiceManager(SocketData.Form).NewSocket := nil;  TServiceManager(SocketData.Form).Caption := TServiceManager(SocketData.Form).Caption + ' - [Offline]';  if TServiceManager(SocketData.Form).NewSocket = nil then exit;  TServiceManager(SocketData.Form).Timer1.Enabled := True;end;procedure TServiceManager.SetUpConnection(Socket: TCustomWinSocket);var  SocketData: TSocketData;  Strings: TStringList;begin  SocketData := TSocketData(Socket.Data);  SocketData.DisconnectProc := @DisconnectProc;  Timer1.Enabled := False;  Caption := Copy(Caption,1,Length(Caption) -12);  Refresh1.Click;end;procedure TServiceManager.ParseData(Socket: TCustomWinSocket; Data: string);var  Command: string;  Stream: TMemoryStream;  Li: TListItem;  Tmp: string;  i: integer;  Strings: TStringList;begin  Command := Split(Data,'|',1);  Delete(Data,1,Length(Command)+1);  if Command = 'List' then begin    Listview1.Clear;    Strings := TStringList.Create;    Strings.Text := Data;    for i := 0 to Strings.Count -1 do begin      if Split(Strings.Strings[i], '|', 1) = '' then Continue;      Li := Listview1.Items.Add;      Li.Caption := Split(Strings.Strings[i], '|', 1);      Li.SubItems.Add(Split(Strings.Strings[i], '|', 2));      if Split(Strings.Strings[i], '|', 3) = '4' then Li.SubItems.Add('Started')      else Li.SubItems.Add('Stopped');      if Split(Strings.Strings[i], '|', 4) = '2' then Li.SubItems.Add('Automatic');      if Split(Strings.Strings[i], '|', 4) = '3' then Li.SubItems.Add('Manual');      if Split(Strings.Strings[i], '|', 4) = '4' then Li.SubItems.Add('Disabled');      Li.SubItems.Add(Split(Strings.Strings[i], '|', 5));      Li.SubItems.Add(Split(Strings.Strings[i], '|', 6));    end;    Strings.Free;    Listview1.Enabled := True;    ListView1.Items[0].Selected := True;  end;end;procedure TServiceManager.Refresh1Click(Sender: TObject);begin  Listview1.Enabled := False;  SendData(NewSocket,'List');end;procedure TServiceManager.Start1Click(Sender: TObject);var  Number: integer;begin  for Number := 0 to ListView1.Items.Count -1 do begin    Application.ProcessMessages;    if not listview1.Items[Number].Selected then Continue;    SendData(NewSocket,'Start|' + listview1.Items[Number].SubItems[0]);  end;  Refresh1.Click;end;procedure TServiceManager.Stop1Click(Sender: TObject);var  Number: integer;begin  for Number := 0 to ListView1.Items.Count -1 do begin    Application.ProcessMessages;    if not listview1.Items[Number].Selected then Continue;    SendData(NewSocket,'Stop|' + listview1.Items[Number].SubItems[0]);  end;  Refresh1.Click;end;procedure TServiceManager.Remove1Click(Sender: TObject);var  Number: integer;begin  for Number := 0 to ListView1.Items.Count -1 do begin    Application.ProcessMessages;    if not listview1.Items[Number].Selected then Continue;    SendData(NewSocket,'Remove|' + listview1.Items[Number].SubItems[0]);  end;  Refresh1.Click;end;procedure TServiceManager.ListView1CustomDrawItem(Sender: TCustomListView;  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);begin  Listview1.Canvas.Brush.Color := $F7F7F7;end;procedure TServiceManager.ListView1CustomDrawSubItem(  Sender: TCustomListView; Item: TListItem; SubItem: Integer;  State: TCustomDrawState; var DefaultDraw: Boolean);begin  Listview1.Canvas.Brush.Color := clWhite;  if (SubItem = 2) and (pos('Stopped',Item.SubItems[1])>0) then ListView1.Canvas.Font.Color := clRed  else ListView1.Canvas.Font.Color := clBlack;end;procedure TServiceManager.Edit1Click(Sender: TObject);var  DisplayName: string;  ServiceName: string;  FileName: string;  Desc: string;  Startup: string;  STartNow: string;begin  if not assigned(listview1.Selected) then exit;  EditService.Edit1.Text := Listview1.Selected.Caption;  EditService.Edit2.Text := Listview1.Selected.SubItems[0];  EditService.Edit3.Text := Listview1.Selected.SubItems[3];  EditService.Edit4.Text := Listview1.Selected.SubItems[4];  if Listview1.Selected.SubItems[2] = 'Automatic' then EditService.ComboBox1.Text := '2: Automatic';  if Listview1.Selected.SubItems[2] = 'Manual' then EditService.ComboBox1.Text := '3: Manual';  if Listview1.Selected.SubItems[2] = 'Disabled' then EditService.ComboBox1.Text := '4: Disabled';  if EditService.ShowModal <> mrok then exit;  DisplayName := EditService.Edit1.Text;  ServiceName := EditService.Edit2.Text;  FileName := EditService.Edit3.Text;  Desc := EditService.Edit4.Text;  Startup := copy(EditService.Combobox1.Text,1,1);  STartNow := '0';  SendData(NewSocket,'Edit|' + ServiceName + '|' + DisplayName + '|' + FileName + '|' + Desc + '|' + Startup + '|' + STartNow);  Refresh1.Click;end;procedure TServiceManager.Install1Click(Sender: TObject);var  DisplayName: string;  ServiceName: string;  FileName: string;  Desc: string;  Startup: string;  STartNow: string;begin  if CreateService.ShowModal <> mrok then exit;  DisplayName := CreateService.Edit1.Text;  ServiceName := CreateService.Edit2.Text;  FileName := CreateService.Edit3.Text;  Desc := CreateService.Edit4.Text;  Startup := copy(CreateService.Combobox1.Text,1,1);  STartNow := '0';  if CreateService.Checkbox1.Checked then StartNow := '1';  SendData(NewSocket,'Install|' + ServiceName + '|' + DisplayName + '|' + FileName + '|' + Desc + '|' + Startup + '|' + STartNow);  Refresh1.Click;end;procedure TServiceManager.Timer1Timer(Sender: TObject);var  NewSocketData: TSocketData;  Li: TListItem;begin  Li := GetListItem(Group,Computer,User);  if Li = nil then exit;  if Li.Data = nil then exit;  NewSocketData := TSocketData(Li.Data);  if NewSocketData.MainSocket = nil then exit;  UnitSharedData.SendData(NewSocketData.MainSocket,'NewConnection|ServiceManagerSocket|' + inttostr(Self.Handle));end;procedure TServiceManager.FormClose(Sender: TObject;  var Action: TCloseAction);var  TmpSocket: TCustomWinSocket;begin  Action := caFree;  try    TmpSocket := NewSocket;    NewSocket := nil;    if TmpSocket <> nil then TmpSocket.Close;  except  end;end;end.