Windows 服務程式管理單元-修改版 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
Windows 服務程式管理單元-修改版
=>新增服務程式安裝與移除。
1.原資料網址:
http://www.swissdelphicenter.ch/torry/showcode.php?id=1322
2.範例:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=75117 3.Windows 服務程式管理單元-修改版,程式碼如下:
unit ServiceManager; interface uses SysUtils, Windows, WinSvc; type TServiceManager = class private { Private declarations } ServiceControlManager: SC_Handle; ServiceHandle: SC_Handle; protected function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; public { Public declarations } function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil; Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean; // Access may be SC_MANAGER_ALL_ACCESS function OpenServiceConnection(ServiceName: PChar): Boolean; function StartService: Boolean; overload; // Simple start function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;overload; // More complex start function StopService: Boolean; procedure PauseService; procedure ContinueService; procedure ShutdownService; procedure DisableService(ServiceName: PChar); function GetStatus: DWORD; function ServiceRunning: Boolean; function ServiceStopped: Boolean; function InstallService(ServiceName, DisplayName: PChar; Filename: string): Boolean; function UnInstallService(ServiceName: PChar): Boolean; end; implementation { TServiceManager } function TServiceManager.Connect(MachineName, DatabaseName: PChar; Access: DWORD): Boolean; begin Result := False; { open a connection to the windows service manager } ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access); Result := (ServiceControlManager <> 0); end; function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean; begin Result := False; { open a connetcion to a specific service } ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS); Result := (ServiceHandle <> 0); end; procedure TServiceManager.PauseService; var ServiceStatus: TServiceStatus; begin { Pause the service: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus); end; function TServiceManager.StopService: Boolean; var ServiceStatus: TServiceStatus; begin { Stop the service } Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus); end; procedure TServiceManager.ContinueService; var ServiceStatus: TServiceStatus; begin { Continue the service after a pause: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus); end; procedure TServiceManager.ShutdownService; var ServiceStatus: TServiceStatus; begin { Shut service down: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus); end; function TServiceManager.StartService: Boolean; begin Result := DoStartService(0, ''); end; function TServiceManager.StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; begin Result := DoStartService(NumberOfArgument, ServiceArgVectors); end; function TServiceManager.GetStatus: DWORD; var ServiceStatus: TServiceStatus; begin { Returns the status of the service. Maybe you want to check this more than once, so just call this function again. Results may be: SERVICE_STOPPED SERVICE_START_PENDING SERVICE_STOP_PENDING SERVICE_RUNNING SERVICE_CONTINUE_PENDING SERVICE_PAUSE_PENDING SERVICE_PAUSED } Result := 0; QueryServiceStatus(ServiceHandle, ServiceStatus); Result := ServiceStatus.dwCurrentState; end; procedure TServiceManager.DisableService(ServiceName: PChar); begin ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); ServiceHandle:= OpenService(ServiceControlManager, ServiceName, SERVICE_CHANGE_CONFIG); ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE, nil,nil,nil,nil,nil,nil,nil); CloseServiceHandle(ServiceHandle); CloseServiceHandle(ServiceControlManager); end; function TServiceManager.ServiceRunning: Boolean; begin Result := (GetStatus = SERVICE_RUNNING); end; function TServiceManager.ServiceStopped: Boolean; begin Result := (GetStatus = SERVICE_STOPPED); end; function TServiceManager.DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; var err: integer; begin Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors); end; function TServiceManager.InstallService(ServiceName, DisplayName: PChar; Filename: string): Boolean; begin Result := False; ServiceControlManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE); if ServiceControlManager = 0 then Exit; try ServiceHandle := CreateService(ServiceControlManager, ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, PChar(Filename), nil, nil, nil, nil, nil); if ServiceHandle<>0 then begin CloseServiceHandle(ServiceHandle); Result:=true; //安裝完成 end else begin CloseServiceHandle(ServiceHandle); Result:=false; //安裝失敗 end; finally CloseServiceHandle(ServiceControlManager); end; end; function TServiceManager.UnInstallService(ServiceName: PChar): Boolean; begin Result := False; ServiceControlManager:=OpenSCManager(nil,nil,GENERIC_WRITE); if ServiceControlManager = 0 then Exit; try ServiceHandle:=OpenService(ServiceControlManager,ServiceName,_DELETE); if DeleteService(ServiceHandle) then begin CloseServiceHandle(ServiceHandle); Result:=true; //移除完成 end else begin CloseServiceHandle(ServiceHandle); Result:=false; //移除失敗 end; finally CloseServiceHandle(ServiceControlManager); end; end; end.ps.若有新增或修改,歡迎提供分享~~ < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,唯學是岸! 發表人 - qoo1234 於 2005/08/08 20:27:47 |
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
補充:
// convert status codes returned by // TServiceManager.GetStatus() to string values function TServiceManager.ServiceGetStrCode(nID : integer) : string; var s : string; begin case nID of SERVICE_STOPPED : s := 'STOPPED'; SERVICE_RUNNING : s := 'RUNNING'; SERVICE_PAUSED : s := 'PAUSED'; SERVICE_START_PENDING : s := 'START/PENDING'; SERVICE_STOP_PENDING : s := 'STOP/PENDING'; SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING'; SERVICE_PAUSE_PENDING : s := 'PAUSE/PENDING'; else s := 'UNKNOWN'; end; Result := s; end;網海無涯,唯學是岸! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |