服务如何自动启动?
我用Delphi新建一个service application,使用install,注册服务以后,发现服务类型是自动,但是没有启动,需要手动启动,请问高手这个问题怎么解决?
[解决办法]
- Delphi(Pascal) code
unit ServiceManager;interfaceuses 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; function GetStatus: DWORD; function GetStatusCn: string; function ServiceRunning: Boolean; function ServiceStopped: Boolean; end;implementation{ TServiceManager }function TServiceManager.Connect(MachineName, DatabaseName: PChar; Access: DWORD): Boolean;begin { open a connection to the windows service manager } ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access); Result := (ServiceControlManager <> 0);end;function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;begin { 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 } QueryServiceStatus(ServiceHandle, ServiceStatus); Result := ServiceStatus.dwCurrentState;end;procedure TServiceManager.DisableService;begin { Implementation is following... } DeleteService(ServiceHandle);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;begin Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);end;function TServiceManager.GetStatusCn: string;begin case GetStatus of SERVICE_STOPPED: Result:='服务已停止'; //SERVICE_START_PENDING: Result:='正在启动服务'; //SERVICE_STOP_PENDING: Result:='正在停止服务'; SERVICE_RUNNING: Result:='服务正在运行'; //SERVICE_CONTINUE_PENDING: Result:='正在重起服务'; //SERVICE_PAUSE_PENDING: Result:='正在停止服务'; SERVICE_PAUSED: Result:='服务已暂停'; else Result:=( '状态未知' ); end;end;end.--调用varFServiceManager:TServiceManager;begin if FServiceManager.OpenServiceConnection( PAnsiChar( serviceName ) ) then begin FServiceManager.StartService; end;
[解决办法]
刚注册的服务是不会自动启动,等机器重起后就会自动运行
[解决办法]
命令行:
net start ServiceName
net stop ServiceName