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;