- 註冊時間
 - 2006-3-13 
 - 最後登錄
 - 2025-7-23 
 - 在線時間
 - 675 小時 
 - 閱讀權限
 - 200 
 - 積分
 - 417 
 - 帖子
 - 1109 
 - 精華
 - 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.
 
  複製代碼 |   
 
  
 |