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 .. 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()    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 .. 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 .

程序中使用 
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 ;
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值