📄 uciaservicetools.pas
字号:
unit uCiaServiceTools;
interface
uses
SysUtils, Classes, Windows, SvcMgr, WinSvc;
type
TCiaService = class(TService)
protected
procedure Start(Sender: TService; var Started: boolean);
procedure Stop(Sender: TService; var Stopped: boolean);
procedure Execute(Sender: TService);
public
function GetServiceController: TServiceController; override;
constructor CreateNew(AOwner: TComponent; Dummy: integer = 0); override;
procedure CreateForm(InstanceClass: TComponentClass; var Reference);
procedure Run;
end;
function CiaStartService(DisplayName: string): Boolean;
function CiaIsService: boolean;
var
CiaService: TCiaService;
implementation
var
FIsService: boolean;
FServiceName: string;
FDisplayName: string;
//------------------------------------------------------------------------------
//---- TCiaService -------------------------------------------------------------
//------------------------------------------------------------------------------
procedure ServiceController(CtrlCode: dword); stdcall;
begin
CiaService.Controller(CtrlCode);
end;
//------------------------------------------------------------------------------
function TCiaService.GetServiceController: TServiceController;
begin
result := ServiceController;
end;
//------------------------------------------------------------------------------
procedure TCiaService.CreateForm(InstanceClass: TComponentClass; var Reference);
begin
SvcMgr.Application.CreateForm(InstanceClass, Reference);
end;
//------------------------------------------------------------------------------
procedure TCiaService.Run;
begin
SvcMgr.Application.Run;
end;
//------------------------------------------------------------------------------
constructor TCiaService.CreateNew(AOwner: TComponent; Dummy: integer);
begin
inherited;
AllowPause := False;
Interactive := True;
DisplayName := FDisplayName;
Name := FServiceName;
OnStart := Start;
OnStop := Stop;
end;
//------------------------------------------------------------------------------
procedure TCiaService.Start(Sender: TService; var Started: boolean);
begin
Started := True;
end;
//------------------------------------------------------------------------------
procedure TCiaService.Execute(Sender: TService);
begin
while not Terminated do
ServiceThread.ProcessRequests(True);
end;
//------------------------------------------------------------------------------
procedure TCiaService.Stop(Sender: TService; var Stopped: boolean);
begin
Stopped := True;
end;
//------------------------------------------------------------------------------
//---- Various -----------------------------------------------------------------
//------------------------------------------------------------------------------
function CiaIsService: boolean;
begin
Result := FIsService;
end;
//------------------------------------------------------------------------------
function CiaStartService(DisplayName: string): Boolean;
var
Mgr, Svc: Integer;
UserName, ServiceStartName: string;
Config: Pointer;
Size: DWord;
n: integer;
begin
FDisplayName := DisplayName;
FServiceName := DisplayName;
for n := 1 to Length(FServiceName) do
if FServiceName[n] = ' ' then
FServiceName[n] := '_';
FIsService := FindCmdLineSwitch('install', ['-','\','/'], True) or
FindCmdLineSwitch('uninstall', ['-','\','/'], True);
if FIsService then begin
SvcMgr.Application.Initialize;
CiaService := TCiaService.CreateNew(SvcMgr.Application, 0);
Result := True;
Exit;
end;
Mgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if Mgr <> 0 then begin
Svc := OpenService(Mgr, PChar(FServiceName), SERVICE_ALL_ACCESS);
FIsService := Svc <> 0;
if FIsService then begin
QueryServiceConfig (Svc, nil, 0, Size);
Config := AllocMem(Size);
try
QueryServiceConfig(Svc, Config, Size, Size);
ServiceStartName := PQueryServiceConfig(Config)^.lpServiceStartName;
if CompareText(ServiceStartName, 'LocalSystem') = 0 then
ServiceStartName := 'SYSTEM';
finally
Dispose(Config);
end;
CloseServiceHandle(Svc);
end;
CloseServiceHandle(Mgr);
end;
if FIsService then begin
Size := 256;
SetLength(UserName, Size);
GetUserName(PChar(UserName), Size);
SetLength(UserName, StrLen(PChar(UserName)));
FIsService := CompareText(UserName, ServiceStartName) = 0;
end;
Result := FIsService;
if FIsService then begin
SvcMgr.Application.Initialize;
CiaService := TCiaService.CreateNew(SvcMgr.Application, 0);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -