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[..] 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 :=;
    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 <>  Then
    Begin
      Result :=True;
      CloseServiceHandle(SvcHandle);
    End ;
    I:=i+;
  Except
  End;
end;

{注销一服务}
function TService.Delete_AService(ServiceName: String): Boolean;
Var  RHandle:Integer;     rc :Boolean;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<> Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <> 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<> Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <> Then
      Begin

        Result :=true;
        {关闭句柄}
        CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;
end;

function TService.OpenScmHandle: Integer;
begin
  try
    SetScmInfo();
     Then CloseServiceHandle(ScmHandle);
    ScmHandle := ;
    ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
     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 := ;
    SHandle :=OpenScmHandle();
    If SHandle<> Then
    Begin
      SvcHandle :=OpenService(SHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If SvcHandle <> Then Result :=True;
    End;
  Except
  End;

end;

function TService.SetScmInfo(): Boolean;
Var
  hostName : ..] of char;
  wsdata : TWSAData;
begin
  try
    WSAStartup ($, 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 > 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 :=;
  serviceArg := Pchar('');
  Try
    Result :=False;
    If ScmHandle <> Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <> Then
      Begin
        Case controlType of
          :  //启动服务器
            Begin
              //ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
              StartService(rHandle,,servicearg);
              i:=;
              While i< Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                sleep();
                i:=i+;
              End;
            End;
          :     //暂停服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_PAUSE,rec_status);
              i:=;
              While i< Do
              Begin
                 QueryServiceStatus(RHandle,Rec_status);
                 if rec_status.dwCurrentState =SERVICE_PAUSED then
                 Begin
                   result :=true;
                   CloseServiceHandle(RHandle);
                   Break;
                 End;
                 Sleep();
                 i:=i+;
              End;
            End;
          :    //唤醒服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_CONTINUE,rec_status);
              i:=;
              While i< do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep();
                i:=i+;
              End;
            End;
          :   //停止服务进程
            begin
              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=;
              While i< Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep();
                i:=i+;
              End;
            End;
          :   //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
            Begin
              rec_status.dwCurrentState :=SERVICE_RUNNING;

              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=;
              While i< Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep();
                i:=i+;
              End;
            End;
        end;
        Result :=true;
        {关闭句柄}
          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<> Then
    Begin
      RHandle := ;
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <> 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() ;
s.Destroy ;
end;

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

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

http://www.cnblogs.com/jxgxy/archive/2010/07/23/1783735.html

mysql服务的注册,启动、停止、注销。 [delphi代码实现]的更多相关文章

  1. MySQL服务使用cmd启动与停止服务

    MySQL未设置自动启动,在使用时需要手动打开服务,方法如下 mysql服务的启动: 以管理员的身份运行cmd命令窗口,输入命名 net start mysql 提示:必须使用管理员身份运行cmd 如 ...

  2. 彻底删除mysql服务(清理注册表)

    由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. 解决步骤: 1.以管理员身份运行命令提示 ...

  3. WAMP中mysql服务突然无法启动 解决方法

    wamp的mysql服务前两天还能用,今天突然不能无法启动了,原因可能是近期电脑强行关机,删除wamp\bin\mysql\mysql5.6.17\data目录下的ib_logfile0和ib_log ...

  4. MariaDB/MySql 服务消失无法启动

    今天启动电脑打开数据库发现这么一个错误:  2003 can't connect to mysql server on localhost 10038  无奈去查看了服务,发现mysql服务消失了,猜 ...

  5. MySQL Install--CentOS 7配置MySQL服务和开启启动

    创建MySQL服务 编辑文件: vim /usr/lib/systemd/system/mysql.service 录入下面内容: PS: 注意修改ExecStart脚本 [Unit]Descript ...

  6. 关于MySQL服务无法正常启动问题

    使用mysql的时候,突然查看服务列表也找不到mysql服务 解决办法: 一.首先打开CMD,切换到MySql安装目录的MySql Server →bin目录下 运行如下命令(具体试个人安装的MySq ...

  7. mysql服务里面没有启动项

    解决:5.0版本:开始->运行->cmd,进到mysql安装的bin目录D:\MySQL\bin>mysqld.exe -installService successfully in ...

  8. windows 下 mysql服务的注册和删除

    注册: mysqld --install 服务名 --defaults-file="C:\Mysql\mysql-5.7\my.ini" 删除 sc delete 服务名 停止服务 ...

  9. windows 服务 安装 删除 启动 停止

    一.停止 sc stop 服务名 二.删除 sc delete 服务名 注意:有时删除不了,报什么“服务为删除标识” ,请将服务窗口关掉就好了. 三.创建 sc create XmlcSendServ ...

随机推荐

  1. Qt自定义圆周动画(360 10.0 的模仿作者写的)

    由于项目需求,需要把一张图片做圆周运动,用到了属性动画,坐标计算等. 在编写代码的过程中,由于太长时间没用sin,cos函数忘了是用弧度为单位,汗呀 下面把代码贴出来 /* * 圆周运动动画 * */ ...

  2. HDU 1251 字典树(前缀树)

    题目大意 :Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).(单词互不相同) ...

  3. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ

    3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更 ...

  4. Openstack REST API

    There are some high quality resources that already cover the OpenStack API, so this is a YEA (yet an ...

  5. 诺心(LECAKE) | 氪加

    诺心(LECAKE) | 氪加 诺心(LECAKE)

  6. ListView之BaseAdapter

    BaseAdapter可以实现自定义的丰富子项视图,本文实现如下所示结果: 实现代码: /* ListView :列表 BaseAdapter 通用的基础适配器 * * */ public class ...

  7. WPF弹出对话确认框

    MessageBoxResult mr = CMessageBox.ShowQuestionMessage("点击“是”继续,点击“否”取消.", "确认删除?" ...

  8. IOS 创建一张有颜色的UIImage

    #import <UIKit/UIKit.h> @interface UIImage (ImageWithColor) + (UIImage *)imageWithColor:(UICol ...

  9. mysql-error --(ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out)

    报错信息: ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out 解决办法: # 查看限制情况 [r ...

  10. Android资源--颜色RGB值以及名称及样图

      颜  色    RGB值 英文名 中文名   #FFB6C1 LightPink 浅粉红   #FFC0CB Pink 粉红   #DC143C Crimson 深红/猩红   #FFF0F5 L ...