-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuMainService.pas
More file actions
145 lines (120 loc) · 3.15 KB
/
uMainService.pas
File metadata and controls
145 lines (120 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
unit uMainService;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs;
type
TMyThread = class(TThread)
private
public
procedure Execute; override;
end;
TMainService = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceCreate(Sender: TObject);
procedure ServiceAfterInstall(Sender: TService);
procedure ServiceBeforeInstall(Sender: TService);
procedure ServiceBeforeUninstall(Sender: TService);
private
FMyThread: TMyThread;
procedure GetServiceName;
procedure GetServiceDisplayName;
public
function GetServiceController: TServiceController; override;
end;
var
MainService: TMainService;
implementation
uses
System.Win.Registry,
uDebugViaServer;
{$R *.dfm}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
MainService.Controller(CtrlCode);
end;
function TMainService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TMainService.GetServiceDisplayName;
var
ServiceDisplayName : String;
begin
ServiceDisplayName := Trim(ParamStr(3));
if ServiceDisplayName <> '' then
DisplayName := ServiceDisplayName;
end;
procedure TMainService.GetServiceName;
var
ServiceName : String;
begin
ServiceName := Trim(ParamStr(2));
if ServiceName <> '' then
Name := ServiceName;
end;
procedure TMainService.ServiceAfterInstall(Sender: TService);
var
Reg : TRegistry;
ImagePath : String;
begin
Reg := TRegistry.Create(KEY_READ OR KEY_WRITE);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+Name, False) then
begin
// set service description
Reg.WriteString('Description', 'Multi instance for service '+Name);
// add name parameter to ImagePath value
ImagePath := ParamStr(0) + ' /name '+Name;
Reg.WriteString('ImagePath', ImagePath);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TMainService.ServiceBeforeInstall(Sender: TService);
begin
GetServiceName;
GetServiceDisplayName;
end;
procedure TMainService.ServiceBeforeUninstall(Sender: TService);
begin
GetServiceName;
end;
procedure TMainService.ServiceCreate(Sender: TObject);
begin
if not Application.Installing then
GetServiceName;
FMyThread := nil;
end;
procedure TMainService.ServiceStart(Sender: TService;
var Started: Boolean);
begin
if FMyThread = nil then
begin
FMyThread := TMyThread.Create;
Started := True;
end;
end;
procedure TMainService.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
if FMyThread <> nil then
begin
FMyThread.Terminate;
while WaitForSingleObject(FMyThread.Handle, WaitHint-100) = WAIT_TIMEOUT do
ReportStatus;
FreeAndNil(FMyThread);
end;
Stopped := True;
end;
procedure TMyThread.Execute;
begin
inherited;
//Do Something
end;
initialization
end.