359 lines
10 KiB
Plaintext
359 lines
10 KiB
Plaintext
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, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edSvcName.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
case GetServiceStatus(edSvcName.Text) of
|
||
0 :
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.', 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, '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
exit;
|
||
end;
|
||
end;
|
||
|
||
if UninstallService(edSvcName.Text) then
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONINFORMATION or MB_OK);
|
||
SaveInput;
|
||
UpdateStatus;
|
||
end else
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', 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, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edSvcName.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
if edDisplayName.Text = '' then
|
||
begin
|
||
MessageBox(Handle, 'ǥ<><C7A5> <20≯<EFBFBD><CCB8><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edDisplayName.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
if edPath.Text = '' then
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edPath.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
if not FileExists(edPath.Text) then
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edPath.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
if cbSvcType.ItemIndex = -1 then
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
cbSvcType.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
if cbStartType.ItemIndex = -1 then
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽʽÿ<CABD>.', 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, '<27>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.', 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, '<27>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.', 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, '<27><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONINFORMATION or MB_OK);
|
||
if chInstallStart.Checked then
|
||
if not ServiceStart(edSvcName.Text) then
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DFBB>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
SaveInput;
|
||
UpdateStatus;
|
||
end else
|
||
MessageBox(Handle, '<27><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', 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, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edSvcName.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
case GetServiceStatus(edSvcName.Text) of
|
||
0 :
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
exit;
|
||
end;
|
||
SERVICE_RUNNING,
|
||
SERVICE_CONTINUE_PENDING,
|
||
SERVICE_START_PENDING :
|
||
begin
|
||
MessageBox(Handle, '<27>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դϴ<D4B4>..', PChar(Caption), MB_ICONINFORMATION or MB_OK);
|
||
exit;
|
||
end;
|
||
end;
|
||
|
||
if ServiceStart(edSvcName.Text) then
|
||
UpdateStatus
|
||
else
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', 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, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
edSvcName.SetFocus;
|
||
exit;
|
||
end;
|
||
|
||
case GetServiceStatus(edSvcName.Text) of
|
||
0 :
|
||
begin
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.', PChar(Caption), MB_ICONWARNING or MB_OK);
|
||
exit;
|
||
end;
|
||
SERVICE_STOPPED,
|
||
SERVICE_STOP_PENDING :
|
||
begin
|
||
MessageBox(Handle, '<27>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դϴ<D4B4>..', PChar(Caption), MB_ICONINFORMATION or MB_OK);
|
||
exit;
|
||
end;
|
||
end;
|
||
|
||
if ServiceStop(edSvcName.Text) then
|
||
UpdateStatus
|
||
else
|
||
MessageBox(Handle, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.', 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 := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (SERVICE_STOPPED)';
|
||
SERVICE_START_PENDING : lbStatus.Caption := '<27><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.. (SERVICE_START_PENDING)';
|
||
SERVICE_STOP_PENDING : lbStatus.Caption := '<27><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.. (SERVICE_STOP_PENDING)';
|
||
SERVICE_RUNNING : lbStatus.Caption := '<27><><EFBFBD>۵<EFBFBD>. (SERVICE_RUNNING)';
|
||
SERVICE_CONTINUE_PENDING : lbStatus.Caption := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (SERVICE_CONTINUE_PENDING)';
|
||
SERVICE_PAUSE_PENDING : lbStatus.Caption := '<27><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.. (SERVICE_PAUSE_PENDING)';
|
||
SERVICE_PAUSED : lbStatus.Caption := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (SERVICE_PAUSED)';
|
||
else lbStatus.Caption := '<27><>ġ<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.';
|
||
end;
|
||
Application.ProcessMessages;
|
||
end;
|
||
|
||
end.
|