- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
- unit Service;
- interface
- uses
- Windows,Classes,SysUtils,Winsvc,nb30,winsock;
- Type
- {服务句柄信息}
- TScmInfo = Record
- HostName : String;
- DataBaseName: String;
- DesireAccess : DWORD;
- End;
- {服务信息}
- TSvcInfo = Record
- HscManager :Integer;
- ServerName :String; //服务名
- DisplayName :String; //服务的显示名
- DesireAccess :DWORD; //
- ServiceType :Dword; //服务的类别
- StartType :Dword; //服务的启动方式
- ErrorControl :Dword; //服务错误控制方式
- BinaryPathName :String; //服务执行文件的具体路径
- LoadOrderGroup :String;
- TagId :Dword;
- Dependencies :String; //依赖:有多个依赖的服务时,中间以空格隔开}
- ServerStartName :String;
- Password :String;
- End;
- //需要注册的服务信息数组
- SvcArray = Array[1..20] of TSvcInfo;
- Type
- {服务控制类}
- TService = Class(TObject)
- Private
- Scm_Info :TScmInfo;
- Svc_Info :TSvcInfo;
- ScmHandle :Integer;
- {服务句柄}
- SvcHandle :Integer;
- Public
- Constructor Create();
- Destructor Destroy();Override;
- Function SetScmInfo():Boolean;
- Function OpenScmHandle():Integer;
- Function SetServiceInfo(TmpSvc :TsvcInfo):Boolean;
- Function CreateService0():Boolean;
- {删除一服务}
- Function Delete_AService(ServiceName :String):Boolean;
- {建立一服务}
- Function Open_Service(ServiceName :String):Boolean;
- {/////////////////////////////////////////////////////////////////////}
- {// 函数名称: IsSvcExists()
- {// 函数功能: 判断系统中相关的服务是否存在
- {// 参数信息: 需要判断的服务名
- {// 返回值: TRUE : WINDOWS 中的服务已存在,FALSE :WINDOWS 中的服务不存在
- {//
- {/////////////////////////////////////////////////////////////////////}
- Function isSvcExists(ServiceName :string):Boolean;
- {/////////////////////////////////////////////////////////////////////////}
- {// 函数名称: Start_Service()
- {// 函数功能: 启动相关的服务进程
- {// 参数信息: 需要启动的服务名
- {// 返回值: TRUE :服务已经启动;FALSE:服务启动失败;
- {/////////////////////////////////////////////////////////////////////////}
- Function Control_Service(ServiceName : String; controlType :integer):Boolean;
- {/////////////////////////////////////////////////////////////////////////}
- {// 函数名称: IsServiceStart()
- {// 函数功能: 判断服务是否启动
- {// 参数信息: 需要判断的服务名
- {// 返回值: TRUE :服务已经启动; FALSE :服务已停止
- {/////////////////////////////////////////////////////////////////////////}
- Function IsServiceStart(ServiceName:String):Boolean;
- End;
- implementation
- { TService }
- constructor TService.Create;
- begin
- try
- ScmHandle := 0;
- SetScmInfo();
- ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
- Except
- End;
- end;
- {建立一服务}
- function TService.CreateService0(): Boolean;
- Var
- i :Integer;
- begin
- try
- OpenScmHandle();
- svc_info.HscManager := ScmHandle;
- Result := False;
- SvcHandle := CreateService(Svc_Info.HscManager ,
- PChar(Svc_Info.ServerName),
- PChar(Svc_Info.DisplayName), Svc_info.DesireAccess , Svc_INfo.ServiceType ,
- Svc_Info.StartType, Svc_Info.ErrorControl,
- PChar(Svc_Info.BinaryPathName),
- PChar(''), LPDWORD(0), PChar(Svc_Info.Dependencies), PChar(Svc_info.ServerStartName),
- PChar(Svc_Info.Password));
- If SvcHandle <> 0 Then
- begin
- Result := True;
- CloseServiceHandle(SvcHandle);
- end ;
- I := i + 1;
- except
- end;
- end;
- {注销一服务}
- function TService.Delete_AService(ServiceName: String): Boolean;
- Var
- RHandle:Integer;
- rc :Boolean;
- begin
- try
- OpenScmHandle();
- Result := False;
- If ScmHandle <> 0 Then
- Begin
- RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
- If RHandle <> 0 Then
- Begin
- Rc := DeleteService(Rhandle);
- Result := Rc;
- {关闭句柄}
- CloseServiceHandle(RHandle);
- End Else Result := True;
- end;
- except
- end;
- end;
- destructor TService.Destroy;
- begin
- try
- CloseServiceHandle(ScmHandle);
- except
- end;
- end;
- {打开数据库的句柄}
- function TService.isSvcExists(ServiceName: string): Boolean;
- Var
- RHandle:Integer;
- rc :Boolean;
- begin
- Try
- OpenScmHandle();
- Result := False;
- If ScmHandle <> 0 Then
- Begin
- RHandle := OpenService(ScmHandle,PChar(ServiceName), SERVICE_ALL_ACCESS);
- If RHandle <> 0 Then
- Begin
- Result := true;
- {关闭句柄}
- CloseServiceHandle(RHandle);
- end;
- end;
- except
- end;
- end;
- function TService.OpenScmHandle: Integer;
- begin
- try
- SetScmInfo();
- if ScmHandle <> 0 Then CloseServiceHandle(ScmHandle);
- ScmHandle := 0;
- ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
- if ScmHandle = 0 then
- ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
- except
- end;
- end;
- {打开一服务}
- function TService.Open_Service(ServiceName: String): Boolean;
- Var
- SHandle :Integer;
- begin
- try
- Result := False;
- sHandle := 0;
- SHandle := OpenScmHandle();
- If SHandle <> 0 Then
- Begin
- SvcHandle := OpenService(SHandle,PChar(ServiceName), SERVICE_ALL_ACCESS );
- If SvcHandle <> 0 Then Result := True;
- end;
- except
- end;
- end;
- function TService.SetScmInfo(): Boolean;
- Var
- hostName : array [0..255] of char;
- wsdata : TWSAData;
- begin
- try
- WSAStartup ($0101, wsdata);
- Result := False;
- gethostname (hostName, SizeOf(hostName));
- If hostName = '' Then
- Exit;
- Scm_Info.HostName := HostName;
- Scm_Info.DesireAccess := SC_MANAGER_ALL_ACCESS;
- except
- end;
- end;
- //设置需要注册的WINDOWS 服务的具体信息
- function TService.SetServiceInfo(TmpSvc: TsvcInfo): Boolean;
- begin
- try
- Result := False;
- If ScmHandle > 0 Then
- Begin
- Svc_Info := TmpSvc;
- Svc_Info.HscManager := ScmHandle;
- Result := True;
- end;
- except
- end;
- end;
- //控制WINDOWS 系统内部的服务
- function TService.Control_Service(ServiceName: String;controlType : Integer): Boolean;
- Var
- RHandle:Integer;
- rc :Boolean;
- Rec_status :TServiceStatus;
- serviceArg :Pchar;
- i :Integer;
- begin
- i :=0;
- serviceArg := Pchar('');
- Try
- Result := False;
- If ScmHandle <> 0 Then
- Begin
- RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
- If RHandle <> 0 Then
- Begin
- Case controlType of
- 1: //启动服务器
- Begin
- //ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
- StartService(rHandle, 0, servicearg);
- i := 0;
- While i < 30 Do
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_RUNNING then
- Begin
- result := True;
- CloseServiceHandle(RHandle);
- Break;
- End;
- Sleep(1000);
- i := i + 1;
- End;
- End;
- 2: //暂停服务进程
- Begin
- ControlService(rHandle, SERVICE_CONTROL_PAUSE, rec_status);
- i := 0;
- While i < 30 Do
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_PAUSED then
- Begin
- result := true;
- CloseServiceHandle(RHandle);
- Break;
- end;
- Sleep(1000);
- i := i + 1;
- end;
- end;
- 3: //唤醒服务进程
- Begin
- ControlService(rHandle, SERVICE_CONTROL_CONTINUE, rec_status);
- i := 0;
- While i < 30 do
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_RUNNING then
- Begin
- result := True;
- CloseServiceHandle(RHandle);
- Break;
- End;
- Sleep(1000);
- i := i + 1;
- end;
- end;
- 4: //停止服务进程
- begin
- ControlService(rHandle, SERVICE_CONTROL_STOP, rec_status);
- i := 0;
- While i < 30 Do
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_STOPPED then
- Begin
- result := True;
- CloseServiceHandle(RHandle);
- Break;
- End;
- Sleep(1000);
- i := i + 1;
- End;
- End;
- 5: //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
- Begin
- rec_status.dwCurrentState := SERVICE_RUNNING;
- ControlService(rHandle, SERVICE_CONTROL_STOP, rec_status);
- i := 0;
- While i < 30 Do
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_STOPPED then
- Begin
- result := True;
- CloseServiceHandle(RHandle);
- Break;
- End;
- Sleep(1000);
- i := i + 1;
- End;
- End;
- end;
- Result := true;
- {关闭句柄}
- if rHandle <> 0 then
- CloseServiceHandle(RHandle);
- end;
- end;
- except
- end;
- end;
- function TService.IsServiceStart(ServiceName: String): Boolean;
- Var
- RHandle:Integer;
- rc :Boolean;
- Rec_status :TServiceStatus;
- begin
- Try
- OpenScmHandle();
- Result := False;
- If ScmHandle <> 0 Then
- Begin
- RHandle := 0;
- RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
- If RHandle <> 0 Then
- Begin
- QueryServiceStatus(RHandle, Rec_status);
- if rec_status.dwCurrentState = SERVICE_RUNNING then
- result := True;
- {关闭句柄}
- CloseServiceHandle(RHandle);
- End;
- End;
- Except
- End;
- end;
- end.
複製代碼 |
|