zoukankan      html  css  js  c++  java
  • mysql服务的注册,启动、停止、注销。 [delphi代码实现]

    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;
  • 相关阅读:
    phpcurl使用
    系统常见问题
    java虚拟机CPU占用率过高排查方法
    oracle常用维护SQL
    PPT常用演示技能
    VS快捷键
    微软企业库缓存使用
    Oracle导sql的一个简便方法
    领域驱动设计
    sqluldr2
  • 原文地址:https://www.cnblogs.com/jxgxy/p/1783735.html
Copyright © 2011-2022 走看看