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