新闻资讯

PChar(SvrName)

PChar(SvrName)

以下为Delphi获取Windows服务、启动和停止服务的代码,使用方法如下:

if SERVICE_RUNNING = ServiceGetStatus('', '服务名') then    StopServices('服务名', true); StartServices('服务名', false);

---------------------------------------------------------------------------------------------------------

unit UStartServices;

interface

uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, WinSVC, StdCtrls;

  //获取服务状态   //参数:sMachine计算机名(本机可用空字符串表示)   sService:服务名称   //输出:服务的状态 SERVICE_RUNNING/SERVICE_STOPPED/SERVICE_PAUSED等   function ServiceGetStatus(sMachine, sService: string ): DWord;   //开启服务  BWait=true表示一直等待服务启动或停止完成后才能继续操作界面   function StartServices(const SvrName: string; BWait: boolean): Boolean;   //停止服务   function StopServices(const SvrName: string; BWait: boolean): Boolean;   //重启服务   function RestartServices(const SvrName: string; BWait: boolean): Boolean;   //等待服务启动或停止   function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean;

implementation

function StartServices(const SvrName: string; BWait: boolean): Boolean; var   SCH, SvcSCH: SC_HANDLE;   arg: PChar;   dwStartType: DWORD; begin   Result := False;   SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);   if SCH <= 0 then Exit;   SvcSCH := OpenService(SCH, PChar(SvrName), 通河县名艾食用油有限公司 SERVICE_ALL_ACCESS);   if SvcSCH <= 0 then Exit;   try     Result := StartService(SvcSCH, 家和宝(江陵)厨具有限公司 0,宁波天鹅体育用品制造有限公司 arg);     if BWait then       WaitForService(SvcSCH, SERVICE_RUNNING);   finally     CloseServiceHandle(SvcSCH);     CloseServiceHandle(SCH);   end; end;

function RestartServices(const SvrName: string; BWait: boolean): Boolean; var   SCH, SvcSCH: SC_HANDLE;   arg: PChar;   dwStartType: DWORD;   ServiceStatus: _SERVICE_STATUS;   SS: TServiceStatus; begin   Result := False;   SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);   if SCH <= 0 then Exit;   SvcSCH := OpenService(SCH, PChar(SvrName), SERVICE_ALL_ACCESS);   if SvcSCH <= 0 then Exit;

  if not ControlService(SvcSCH, SERVICE_CONTROL_INTERROGATE,成功案例 ServiceStatus) then exit;   if ServiceStatus.dwCurrentState = SERVICE_RUNNING then  //如果正在运行,则先停止服务   begin     ControlService(SvcSCH, SERVICE_CONTROL_STOP, SS);     WaitForService(SvcSCH, SERVICE_STOPPED);     //StopServices(SvrName, true);   end;

  try     Result := StartService(SvcSCH, 0, arg);     if BWait then       WaitForService(SvcSCH, SERVICE_RUNNING);   finally     CloseServiceHandle(SvcSCH);     CloseServiceHandle(SCH);   end; end;

function StopServices(const SvrName: string; BWait: boolean): Boolean; var   SCH, SvcSCH: SC_HANDLE;   SS: TServiceStatus; begin   Result := False;   SCH := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);   if SCH <= 0 then Exit;   SvcSCH := OpenService(SCH, PChar(SvrName), SERVICE_ALL_ACCESS);   if SvcSCH <= 0 then Exit;   try     Result := ControlService(SvcSCH, SERVICE_CONTROL_STOP, SS);     if BWait then       WaitForService(SvcSCH, SERVICE_STOPPED);   finally     CloseServiceHandle(SCH);     CloseServiceHandle(SvcSCH);   end; end;

function ServiceGetStatus(sMachine, sService: string ): DWord; var   schm,      //service control manager handle   schs: SC_Handle;   //service handle   ss: TServiceStatus;  //service status   dwStat : DWord;  //current service status begin   dwStat := 0;   schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);   if(schm > 0)then   begin     //open a handle to the specified service     schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);     if(schs > 0)then     begin       //retrieve the current status of the specified service       if(QueryServiceStatus(schs, ss))then       begin         dwStat := ss.dwCurrentState;       end;

      CloseServiceHandle(schs);  //close service handle     end;

    CloseServiceHandle(schm);  // close service control manager handle   end;

  Result := dwStat; end;

function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean; var   PendingStatus: Longword;   ServiceStatus: _SERVICE_STATUS;   Error: Integer; begin   Result := False;   case AStatus of     SERVICE_RUNNING: PendingStatus := SERVICE_START_PENDING;     SERVICE_STOPPED: PendingStatus := SERVICE_STOP_PENDING;   end;   repeat     if not ControlService(ServiceHandle, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then     begin            end;     if ServiceStatus.dwWin32ExitCode <> 0 then       Break;     Result := ServiceStatus.dwCurrentState = AStatus;     if not Result and (ServiceStatus.dwCurrentState = PendingStatus) then       Sleep(ServiceStatus.dwWaitHint)     else       Break;   until Result; end;

end.联系我们

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。