unit DSvcInstMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; const INI_CONFIG = 'ServiceInstall.ini'; type TDlgSvcInstMain = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; edSvcName: TEdit; edDisplayName: TEdit; edPath: TEdit; cbSvcType: TComboBox; cbStartType: TComboBox; btnStatus: TButton; btnInstall: TButton; btnDelete: TButton; Label6: TLabel; lbStatus: TLabel; btnStart: TButton; btnStop: TButton; chInstallStart: TCheckBox; chStayOnTop: TCheckBox; chInteractive: TCheckBox; procedure btnInstallClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnStatusClick(Sender: TObject); procedure btnStartClick(Sender: TObject); procedure btnStopClick(Sender: TObject); procedure chStayOnTopClick(Sender: TObject); procedure cbSvcTypeChange(Sender: TObject); private { Private declarations } public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; procedure SaveInput; procedure LoadInput; procedure UpdateStatus; end; var DlgSvcInstMain: TDlgSvcInstMain; implementation uses Tocsg.Service, Tocsg.Controls, Winapi.WinSvc, System.IniFiles, Tocsg.Safe, Tocsg.Path; {$R *.dfm} Constructor TDlgSvcInstMain.Create(aOwner: TComponent); begin Inherited Create(aOwner); LoadInput; UpdateStatus; end; Destructor TDlgSvcInstMain.Destroy; begin Inherited; end; procedure TDlgSvcInstMain.SaveInput; var ini: TIniFile; begin Guard(ini, TIniFile.Create(GetRunExePathDir + INI_CONFIG)); ini.WriteString('RecentInfo', 'Name', edSvcName.Text); ini.WriteString('RecentInfo', 'Display', edDisplayName.Text); ini.WriteString('RecentInfo', 'Path', edPath.Text); ini.WriteInteger('RecentInfo', 'Type', cbSvcType.ItemIndex); ini.WriteInteger('RecentInfo', 'Mode', cbStartType.ItemIndex); ini.WriteBool('RecentInfo', 'InstallAfter', chInstallStart.Checked); end; procedure TDlgSvcInstMain.LoadInput; var sPath: String; ini: TIniFile; begin sPath := GetRunExePathDir + INI_CONFIG; if FileExists(sPath) then begin Guard(ini, TIniFile.Create(sPath)); edSvcName.Text := ini.ReadString('RecentInfo', 'Name', ''); edDisplayName.Text := ini.ReadString('RecentInfo', 'Display', ''); edPath.Text := ini.ReadString('RecentInfo', 'Path', ''); cbSvcType.ItemIndex := ini.ReadInteger('RecentInfo', 'Type', -1); cbStartType.ItemIndex := ini.ReadInteger('RecentInfo', 'Mode', -1); chInstallStart.Checked := ini.ReadBool('RecentInfo', 'InstallAfter', false); Application.ProcessMessages; end; end; procedure TDlgSvcInstMain.btnDeleteClick(Sender: TObject); begin edSvcName.Text := Trim(edSvcName.Text); edDisplayName.Text := Trim(edDisplayName.Text); edPath.Text := Trim(edPath.Text); if edSvcName.Text = '' then begin MessageBox(Handle, '¼­ºñ½º À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edSvcName.SetFocus; exit; end; case GetServiceStatus(edSvcName.Text) of 0 : begin MessageBox(Handle, 'Á¸ÀçÇÏÁö ¾Ê´Â ¼­ºñ½ºÀÔ´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; SERVICE_RUNNING, SERVICE_CONTINUE_PENDING, SERVICE_START_PENDING : if not ServiceStop(edSvcName.Text) then begin MessageBox(Handle, '¼­ºñ½º¸¦ ÁßÁöÇÏ´ÂÁß ½ÇÆÐÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; end; if UninstallService(edSvcName.Text) then begin MessageBox(Handle, '¼­ºñ½º Á¦°Å¿¡ ¼º°øÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONINFORMATION or MB_OK); SaveInput; UpdateStatus; end else MessageBox(Handle, '¼­ºñ½º Á¦°Å¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONSTOP or MB_OK); end; procedure TDlgSvcInstMain.btnInstallClick(Sender: TObject); var dwSvcType: DWORD; nStartMode: Integer; begin edSvcName.Text := Trim(edSvcName.Text); edDisplayName.Text := Trim(edDisplayName.Text); edPath.Text := Trim(edPath.Text); if edSvcName.Text = '' then begin MessageBox(Handle, '¼­ºñ½º À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edSvcName.SetFocus; exit; end; if edDisplayName.Text = '' then begin MessageBox(Handle, 'Ç¥½Ã À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edDisplayName.SetFocus; exit; end; if edPath.Text = '' then begin MessageBox(Handle, '¼­ºñ½º °æ·Î¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edPath.SetFocus; exit; end; if not FileExists(edPath.Text) then begin MessageBox(Handle, '°æ·Î¿¡ ¼­ºñ½º ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); edPath.SetFocus; exit; end; if cbSvcType.ItemIndex = -1 then begin MessageBox(Handle, '¼­ºñ½º À¯ÇüÀ» ¼±ÅÃÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); cbSvcType.SetFocus; exit; end; if cbStartType.ItemIndex = -1 then begin MessageBox(Handle, '½ÃÀÛ À¯ÇüÀ» ¼±ÅÃÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); cbStartType.SetFocus; exit; end; case cbSvcType.ItemIndex of 0 : dwSvcType := SERVICE_KERNEL_DRIVER; 1 : dwSvcType := SERVICE_FILE_SYSTEM_DRIVER; 2 : dwSvcType := SERVICE_ADAPTER; 3 : dwSvcType := SERVICE_RECOGNIZER_DRIVER; 4 : dwSvcType := SERVICE_DRIVER; 5 : dwSvcType := SERVICE_WIN32_OWN_PROCESS; 6 : dwSvcType := SERVICE_WIN32_SHARE_PROCESS; 7 : dwSvcType := SERVICE_WIN32; 8 : dwSvcType := SERVICE_INTERACTIVE_PROCESS; else begin MessageBox(Handle, 'À߸øµÈ ¼­ºñ½º À¯ÇüÀÔ´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); cbSvcType.SetFocus; exit; end; end; case dwSvcType of 5, 6 : if chInteractive.Checked then dwSvcType := dwSvcType or SERVICE_INTERACTIVE_PROCESS; end; case cbStartType.ItemIndex of 0 : nStartMode := SERVICE_BOOT_START; 1 : nStartMode := SERVICE_SYSTEM_START; 2 : nStartMode := SERVICE_AUTO_START; 3 : nStartMode := SERVICE_DEMAND_START; 4 : nStartMode := SERVICE_DISABLED; else begin MessageBox(Handle, 'À߸øµÈ ½ÃÀÛ À¯ÇüÀÔ´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); cbStartType.SetFocus; exit; end; end; if InstallService(edSvcName.Text, edPath.Text, edDisplayName.Text, dwSvcType, nStartMode) then begin MessageBox(Handle, '¼³Ä¡¸¦ ¼º°øÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONINFORMATION or MB_OK); if chInstallStart.Checked then if not ServiceStart(edSvcName.Text) then MessageBox(Handle, '¼­ºñ½º ½ÃÀÛÁß ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); SaveInput; UpdateStatus; end else MessageBox(Handle, '¼³Ä¡¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONSTOP or MB_OK); end; procedure TDlgSvcInstMain.btnStartClick(Sender: TObject); begin edSvcName.Text := Trim(edSvcName.Text); edDisplayName.Text := Trim(edDisplayName.Text); edPath.Text := Trim(edPath.Text); if edSvcName.Text = '' then begin MessageBox(Handle, '¼­ºñ½º À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edSvcName.SetFocus; exit; end; case GetServiceStatus(edSvcName.Text) of 0 : begin MessageBox(Handle, '¼­ºñ½º°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; SERVICE_RUNNING, SERVICE_CONTINUE_PENDING, SERVICE_START_PENDING : begin MessageBox(Handle, 'ÀÌ¹Ì ½ÃÀÛÁß ÀÔ´Ï´Ù..', PChar(Caption), MB_ICONINFORMATION or MB_OK); exit; end; end; if ServiceStart(edSvcName.Text) then UpdateStatus else MessageBox(Handle, '¼­ºñ½º ½ÃÀÛÀ» ½ÇÆÐÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONSTOP or MB_OK); end; procedure TDlgSvcInstMain.btnStopClick(Sender: TObject); begin edSvcName.Text := Trim(edSvcName.Text); edDisplayName.Text := Trim(edDisplayName.Text); edPath.Text := Trim(edPath.Text); if edSvcName.Text = '' then begin MessageBox(Handle, '¼­ºñ½º À̸§À» ÀÔ·ÂÇØ ÁֽʽÿÀ.', PChar(Caption), MB_ICONWARNING or MB_OK); edSvcName.SetFocus; exit; end; case GetServiceStatus(edSvcName.Text) of 0 : begin MessageBox(Handle, '¼­ºñ½º°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; SERVICE_STOPPED, SERVICE_STOP_PENDING : begin MessageBox(Handle, 'ÀÌ¹Ì ÁßÁöÁß ÀÔ´Ï´Ù..', PChar(Caption), MB_ICONINFORMATION or MB_OK); exit; end; end; if ServiceStop(edSvcName.Text) then UpdateStatus else MessageBox(Handle, '¼­ºñ½º ÁßÁö¸¦ ½ÇÆÐÇÏ¿´½À´Ï´Ù.', PChar(Caption), MB_ICONWARNING or MB_OK); end; procedure TDlgSvcInstMain.cbSvcTypeChange(Sender: TObject); begin case cbSvcType.ItemIndex of 5, 6 : chInteractive.Enabled := true; else chInteractive.Enabled := false; end; end; procedure TDlgSvcInstMain.chStayOnTopClick(Sender: TObject); begin if chStayOnTop.Checked then FormStyle := fsStayOnTop else FormStyle := fsNormal; end; procedure TDlgSvcInstMain.btnStatusClick(Sender: TObject); begin UpdateStatus; end; procedure TDlgSvcInstMain.UpdateStatus; begin edSvcName.Text := Trim(edSvcName.Text); edDisplayName.Text := Trim(edDisplayName.Text); edPath.Text := Trim(edPath.Text); if edSvcName.Text = '' then exit; case GetServiceStatus(edSvcName.Text) of SERVICE_STOPPED : lbStatus.Caption := 'ÁßÁöµÊ. (SERVICE_STOPPED)'; SERVICE_START_PENDING : lbStatus.Caption := '½ÃÀÛ ÇÏ´ÂÁß.. (SERVICE_START_PENDING)'; SERVICE_STOP_PENDING : lbStatus.Caption := 'ÁßÁö ÇÏ´ÂÁß.. (SERVICE_STOP_PENDING)'; SERVICE_RUNNING : lbStatus.Caption := '½ÃÀÛµÊ. (SERVICE_RUNNING)'; SERVICE_CONTINUE_PENDING : lbStatus.Caption := 'ÁøÇàÁß.. (SERVICE_CONTINUE_PENDING)'; SERVICE_PAUSE_PENDING : lbStatus.Caption := 'Á¤Áö ÇÏ´ÂÁß.. (SERVICE_PAUSE_PENDING)'; SERVICE_PAUSED : lbStatus.Caption := 'Á¤ÁöµÊ. (SERVICE_PAUSED)'; else lbStatus.Caption := '¼³Ä¡µÇ¾î ÀÖÁö ¾ÊÀ½.'; end; Application.ProcessMessages; end; end.