mysql服务的注册,启动、停止、注销。 [delphi代码实现]

来源:互联网 发布:犀牛软件授权码 编辑:程序博客网 时间:2024/05/18 01:02
复制代码
mysql服务的注册,启动、停止、注销。
unit Service;
interface
uses   Windows,Classes,SysUtils,Winsvc,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..20of 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()    Control_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;
b:SC_HANDLE;
begin
  Try
    OpenScmHandle();
//    svc_info.HscManager := ScmHandle;

    svc_info.HscManager:
= OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);
    Result :
=False;
   
// SvcHandle:=

     b:
=CreateService(svc_Info.HscManager,
                     Pchar(svc_Info.ServerName),
                     Pchar(Svc_Info.DisplayName),
                     SERVICE_ALL_ACCESS,                                       
// Svc_info.DesireAccess
                     SERVICE_INTERACTIVE_PROCESS 
or SERVICE_WIN32_OWN_PROCESS, // svc_INfo.ServiceType,
                     SERVICE_AUTO_START,                                       
// svc_INfo.ServiceType,
                     SERVICE_ERROR_NORMAL,                                     
// Svc_Info.ErrorControl,

                     pchar(Svc_Info.BinaryPathName),
                     
nil,nil,nil,nil,nil);

{  //原形
   b:=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
   If b 
<> 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..255of 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.

程序中使用 
uses  Service;
///***********************************
//注册 必须把my.ini放在 mysqld-nt.exe路径或者 系统windows 下
procedure TForm1.Button1Click(Sender: TObject);
var s:TService;
a:TScmInfo ;
b:TSvcInfo;
begin
s:
=TService.Create;
b.ServerName :
='mysql'
b.DisplayName :
='sdfss';
b.BinaryPathName :
='D:\APMXE5\mysql60\bin\mysqld-nt.exe'//路径和exe文件
s.SetScmInfo ;
s.SetServiceInfo(b);
s.CreateService0;
s.Destroy ;
end;

//******************
//运行
procedure TForm1.Button2Click(Sender: TObject);
var s:TService;
begin
s:
=TService.Create;
s.Control_Service(
'mysql',1) ;
s.Destroy ;
end;

//**************
//停止
var s:TService;
begin
s:
=TService.Create;
s.Control_Service(
'mysql',4) ;
s.Destroy ;
end;

//**********************
注销
procedure TForm1.Button4Click(Sender: TObject);
var s:TService;
begin
s:
=TService.Create;
s.Delete_AService(
'mysql') ;
s.Destroy ;
end;
复制代码
0 0
原创粉丝点击