![]() |
delphi调用API来实启动/停止/卸载windows服务
建议参考一下Delphi的ScktSrvr原码, $(DELPHI)\Source\Vcl\ScktSrvr.dpr
-------------------------------------------------------------------------------- windows 系统服务 -------------------------------------------------------------------------------- function StartService(AServName: string): Boolean; //use WinSvc var SCManager, hService: SC_HANDLE; lpServiceArgVectors: PChar; begin SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); Result := SCManager <> 0; if Result then try hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS); Result := hService <> 0; if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then Exception.Create('The specified service does not exist'); if hService <> 0 then try lpServiceArgVectors := nil; Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors)); if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then Result := True; finally CloseServiceHandle(hService); end; finally CloseServiceHandle(SCManager); end; end; function StopService(AServName: string): Boolean; var SCManager, hService: SC_HANDLE; SvcStatus: TServiceStatus; begin SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); Result := SCManager <> 0; if Result then try hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS); Result := hService <> 0; if Result then try //停止并卸载服务; Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus); //删除服务,这一句可以不要; // DeleteService(hService); finally CloseServiceHandle(hService); end; finally CloseServiceHandle(SCManager); end; end; ------------------------------------------------------------------------------------------------------ Others ------------------------------------------------------------------------------------------------------ uses Winsvc,..,; function RunServies(svr:String):Boolean;//启动某个服务; var schService:SC_HANDLE; schSCManager:SC_HANDLE; ssStatus:TServiceStatus; Argv:PChar; begin schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); schService:=OpenService(schSCManager,Pchar(svr),SERVICE_ALL_ACCESS); result := True; try if StartService(schService,0,Argv) then begin while (QueryServiceStatus(schService,ssStatus)) do begin Sleep(500); Application.ProcessMessages; if ssStatus.dwCurrentState=SERVICE_START_PENDING then Sleep(500) else Break; end;//while if ssStatus.dwCurrentState=SERVICE_RUNNING then result := True else result := False; end else result := False; finally CloseServiceHandle(schService); CloseServiceHandle(schSCManager); end; end; function StopServies(svr:String):Boolean;//停止某个服务; var schService:SC_HANDLE; schSCManager:SC_HANDLE; ssStatus:TServiceStatus; begin schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); schService:=OpenService(schSCManager,Pchar(svr),SERVICE_ALL_ACCESS); try if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then begin Sleep(1000); while (QueryServiceStatus(schService,ssStatus)) do begin Application.ProcessMessages; if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then Sleep(1000) else break; end; //while if ssStatus.dwCurrentState=SERVICE_STOPPED then result := True else result := False; end else result := False; finally CloseServiceHandle(schService); CloseServiceHandle(schSCManager); end; end; ------------------------------------------------------------------------------------------------------ Others ------------------------------------------------------------------------------------------------------ unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Winsvc; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private schService:SC_HANDLE; schSCManager:SC_HANDLE; ssStatus:TServiceStatus; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); schService:=OpenService(schSCManager,'alerter',SERVICE_ALL_ACCESS); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseServiceHandle(schService); CloseServiceHandle(schSCManager); end; procedure TForm1.Button1Click(Sender: TObject); var Argv:PChar; begin if StartService(schService,0,Argv) then begin form1.caption:='Start Service Now '; Sleep(1000); while (QueryServiceStatus(schService,ssStatus)) do begin Application.ProcessMessages; if ssStatus.dwCurrentState=SERVICE_START_PENDING then begin form1.caption:=form1.caption+('.'); Sleep(1000); end else break; end; if ssStatus.dwCurrentState=SERVICE_RUNNING then form1.caption:='Service Start Ok' else form1.caption:='Service Start Fail'; end else form1.caption:='Service Start Fail'; end; procedure TForm1.Button2Click(Sender: TObject); begin if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then begin form1.caption:='Stopping Service Now '; Sleep(1000); while (QueryServiceStatus(schService,ssStatus)) do begin Application.ProcessMessages; if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then begin form1.caption:=form1.caption+('.'); Sleep(1000); end else break; end; if ssStatus.dwCurrentState=SERVICE_STOPPED then form1.caption:='Service Stop Ok' else form1.caption:='Service Stop Fail'; end else form1.caption:='Service Stop Fail'; end; end. |
所有时间均为北京时间。现在的时间是 21:33。 |
Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.