bianxie
- 本文主要講解了如何使用delphi新建服務,停止系統服務,以及獲取服務狀態(tài)和新建系統服務器的方法,以下是關鍵代碼:
-
- unit Servicescontrol;
-
- interface
- uses Windows,Messages,SysUtils,Winsvc,Dialogs;
-
- function StartServices(Const SvrName:String):Boolean;
- function StopServices(Const SvrName:String):Boolean;
- function QueryServiceStatu(Const SvrName: String):String;
- function CreateServices(Const SvrName,FilePath:String):Boolean;
- function DeleteServices(Const SvrName: String):Boolean;
-
- implementation
-
-
- //開啟服務
- function StartServices(Const SvrName: String): Boolean;
- var
- a,b:SC_HANDLE;
- c:PChar;
- begin
- Result:=False;
-
- a:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
-
- if a <=0 then Exit;
-
- b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);
-
- if b <=0 then Exit;
- try
- Result:=StartService(b,0,c);
- CloseServiceHandle(b);
- CloseServiceHandle(a);
- except
- CloseServiceHandle(b);
- CloseServiceHandle(a);
- Exit;
- end;
- end;
-
-
- //停止服務
- function StopServices(Const SvrName: String): Boolean;
- var
- a,b: SC_HANDLE;
- d: TServiceStatus;
- begin
- Result := False;
-
- a :=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
-
- if a <=0 then Exit;
-
- b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);
-
- if b <=0 then Exit;
- try
- Result:=ControlService(b,SERVICE_CONTROL_STOP,d);
- CloseServiceHandle(a);
- CloseServiceHandle(b);
- except
- CloseServiceHandle(a);
- CloseServiceHandle(b);
- Exit;
- end;
- end;
-
-
- //查詢當前服務的狀態(tài)
- function QueryServiceStatu(Const SvrName: String): String;
- var
- a,b: SC_HANDLE;
- d: TServiceStatus;
- begin
- Result := '未安裝';
-
- a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
-
- if a <=0 then Exit;
-
- b := OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);
-
- if b <= 0 then Exit;
- try
- QueryServiceStatus(b,d);
- if d.dwCurrentState = SERVICE_RUNNING then
- Result := '啟動' //Run
- else if d.dwCurrentState = SERVICE_RUNNING then
- Result := 'Wait' //Runing
- else if d.dwCurrentState = SERVICE_START_PENDING then
- Result := 'Wait' //Pause
- else if d.dwCurrentState = SERVICE_STOP_PENDING then
- Result := '停止' //Pause
- else if d.dwCurrentState = SERVICE_PAUSED then
- Result := '暫停' //Pause
- else if d.dwCurrentState = SERVICE_STOPPED then
- Result := '停止' //Stop
- else if d.dwCurrentState = SERVICE_CONTINUE_PENDING then
- Result := 'Wait' //Pause
- else if d.dwCurrentState = SERVICE_PAUSE_PENDING then
- Result := 'Wait'; //Pause
-
- CloseServiceHandle(a);
- CloseServiceHandle(b);
- except
- CloseServiceHandle(a);
- CloseServiceHandle(b);
- Exit;
- end;
- end;
-
-
- {建立服務}
- function CreateServices(Const SvrName,FilePath: String): Boolean;
- var
- a,b:SC_HANDLE;
- begin
- Result:=False;
- if FilePath ='' then Exit;
-
- a := OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);
-
- if a <= 0 then Exit;
- try
- b := CreateService(a,PChar(SvrName),
- PChar(SvrName),
- SERVICE_ALL_ACCESS,
- SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS,
- SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
- PChar(FilePath),nil,nil,nil,nil,nil);
- if b <= 0 then begin
- ShowMessage( SysErrorMessage( GetlastError ));
- Exit;
- end;
- CloseServiceHandle(a);
- CloseServiceHandle(b);
-
- Result := True;
- except
- CloseServiceHandle(a);
- CloseServiceHandle(b);
- Exit;
- end;
- end;
-
-
- {卸載服務}
- function DeleteServices(Const SvrName: String): Boolean;
- var
- a,b:SC_HANDLE;
- begin
- Result:=False;
- a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
- if a <= 0 then Exit;
- b :=OpenService(a,PChar(SvrName),STANDARD_RIGHTS_REQUIRED);
- if b <= 0 then Exit;
- try
- Result := DeleteService(b);
-
- if not Result then
- ShowMessage(SysErrorMessage(GetlastError));
- CloseServiceHandle(b);
- CloseServiceHandle(a);
- except
- CloseServiceHandle(b);
- CloseServiceHandle(a);
- Exit;
- end;
- end;
- end.
-
- 調用方法:
-
- {啟動服務}
- StartServices(服務名);
- {停止服務}
- StopServices(服務名);
- {新建服務}
- CreateServices(服務名,exe文件路徑);
- {刪除服務}
- DeleteServices(服務名);
- {獲取服務狀態(tài)}
- string:=QueryServiceStatu(服務名);
|