![]() |
![]() |
#1 (permalink) |
高级会员
注册日期: 2009-07-09
住址: 亦庄经济开发区2号院大族广场1502
帖子: 535
![]() |
![]()
建议参考一下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.
__________________
地址:北京亦庄经济技术开发区荣华南路10号院5号楼705 电话:010-82356575/76/77转6070 联系人:苏秋英 手机微信同号:13811870548 QQ: 1170923055 |
![]() |
![]() |