用delphi如何启动或者停止一个服务?
我需要的是启动或者停止一个已经存在的服务,
谢谢。

解决方案 »

  1.   


     uses   winsvc;   
      OpenService获得服务句柄hService   
      然后用ControlService来控制服务   
      SERVICE_CONTROL_PAUSE     暂停   
      SERVICE_CONTROL_STOP       停止   
      SERVICE_CONTROL_CONTINUE   
        
      另外还可以还可以用命令行的形式   
      winexec(pchar('cmd.exe   /c   net   stop   '+servicename),sw_hide);   
      winexec(pchar('cmd.exe   /c   net   start   '+servicename),sw_hide);   
      winexec(pchar('cmd.exe   /c   net   pause   '+servicename),sw_hide);
      

  2.   

    我是用在inno打包的,你的代码是无法编译的。
      

  3.   

    BAT的内容,不用我说了吧,在ISS档里加上[Run]
    Filename: {app}\Install.bat[UninstallRun]
    Filename: {app}\Uninstall.bat
      

  4.   

    忘记说,打包时,也要加上这两个bat档
      

  5.   


    我现在就是通过内置一个cmd脚本来实现的,
    可我在想,能不能用pascal代码来实现,
    我自己研究了好几天没有结果,所以来请教大家了。
      

  6.   

    私信里有,因为刚刚我连回三帖,不能再回第四帖,你看看私信吧,里面有方案还有另一个,你可以写个控制台程式,在INNO里调用来检测
      

  7.   

    启动停止服务函数,加上WinSvc单元编译function ServiceStart(const ServiceName: string; const Computer: PChar = nil): Boolean;
    {
      启动服务
    }
    var
      SCM, SCH: SC_Handle;
      P: PChar;
    begin
      Result := False;
      if IsLocalComputer(Computer) then
        SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS)
      else
        SCM := OpenSCManager(Computer, nil, SC_MANAGER_ALL_ACCESS);
      if SCM <> 0 then
      begin
        SCH := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
        if SCH <> 0 then
        begin
          Result := StartService(SCH, 0, P);
          CloseServiceHandle(SCH);
        end;
        CloseServiceHandle(SCM);
      end;
    end;function ServiceStop(const ServiceName: string; const Computer: PChar = nil): Boolean;
    {
      停止服务
    }
    var
      SCM, SCH: SC_Handle;
      ServiceStatus: TServiceStatus;
    begin
      Result := False;
      if IsLocalComputer(Computer) then
        SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS)
      else
        SCM := OpenSCManager(Computer, nil, SC_MANAGER_ALL_ACCESS);
      if SCM <> 0 then
      begin
        SCH := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
        if SCH <> 0 then
        begin
          Result := ControlService(SCH, SERVICE_CONTROL_STOP, ServiceStatus);
          CloseServiceHandle(SCH);
        end;
        CloseServiceHandle(SCM);
      end;
    end;
      

  8.   

    哥们,你的代码编译通不过呀。
    对了,我的服务名是  HZ_CommSrv,
    麻烦你帮我些完整代码吧。感激你啦。
      

  9.   

    完整的代码,编译通过,如果还有问题,我就要杀人了。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, WinSvc, StdCtrls;type
      TForm1 = class(TForm)
        btnStart: TButton;
        procedure btnStartClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function ServiceStart(const ServiceName: string; const Computer: PChar = nil): Boolean;
    {
      启动服务
    }
    var
      SCM, SCH: SC_Handle;
      P: PChar;
    begin
      Result := False;
      SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      if SCM <> 0 then
      begin
        SCH := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
        if SCH <> 0 then
        begin
          Result := StartService(SCH, 0, P);
          CloseServiceHandle(SCH);
        end;
        CloseServiceHandle(SCM);
      end;
    end;function ServiceStop(const ServiceName: string; const Computer: PChar = nil): Boolean;
    {
      停止服务
    }
    var
      SCM, SCH: SC_Handle;
      ServiceStatus: TServiceStatus;
    begin
      Result := False;
      SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      if SCM <> 0 then
      begin
        SCH := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
        if SCH <> 0 then
        begin
          Result := ControlService(SCH, SERVICE_CONTROL_STOP, ServiceStatus);
          CloseServiceHandle(SCH);
        end;
        CloseServiceHandle(SCM);
      end;
    end;procedure TForm1.btnStartClick(Sender: TObject);
    begin
      ServiceStart('HZ_CommSrv');
    end;end.
      

  10.   

    我是用在INNO SETUP打包工具中的,
    确实是不能编译。呵呵。这应该是编译器的问题,
    不是你的代码问题。你用过INNO吗?
    想让你修改一下,应用在INNO上面。
    成功的话,太感谢了。
      

  11.   

    在INNO中无法编译,不过还是感谢你的热心解答,分就给你了。