如何不用Delphi提供的ServiceApp写系统服务程序
2009-11-26 15:01
681 查看
首先定义以下变量: var ServiceName: pchar = ''; var Status: TServiceStatus; StatusHandle: SERVICE_STATUS_HANDLE; ServiceTable: array [0..1] of TServiceTableEntry; Stopped: boolean; Paused: boolean; 服务入口程序: procedure ServiceMain; begin repeat if not Paused then begin Sleep(1000); end; until Stopped; end; 服务控制: procedure ServiceCtrlHandler(Control: dword); stdcall; begin case Control of SERVICE_CONTROL_STOP: begin Stopped := True; Status.dwCurrentState := SERVICE_STOP_PENDING; SetServiceStatus(StatusHandle, Status); end; SERVICE_CONTROL_PAUSE: begin Paused := True; Status.dwcurrentstate := SERVICE_PAUSED; SetServiceStatus(StatusHandle, Status); end; SERVICE_CONTROL_CONTINUE: begin Paused := False; Status.dwCurrentState := SERVICE_RUNNING; SetServiceStatus(StatusHandle, Status); end; SERVICE_CONTROL_INTERROGATE: SetServiceStatus(StatusHandle, Status); SERVICE_CONTROL_SHUTDOWN: Stopped := True; end; end; 服务分配: procedure ServiceCtrlDispatcher(dwArgc: dword; var lpszArgv: pchar); stdcall; begin StatusHandle := RegisterServiceCtrlHandler(ServiceName, @ServiceCtrlHandler); if StatusHandle <> 0 then begin ZeroMemory(@Status, SizeOf(Status)); Status.dwServiceType := SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS; Status.dwCurrentState:= SERVICE_START_PENDING; Status.dwControlsAccepted := SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_PAUSE_CONTINUE; Status.dwWaitHint := 1000; SetServiceStatus(StatusHandle, Status); Stopped := False; Paused := False; Status.dwCurrentState := SERVICE_RUNNING; SetServiceStatus(StatusHandle, Status); ServiceMain; //调用主程序 Status.dwCurrentState := SERVICE_STOPPED; SetServiceStatus(StatusHandle, Status); end; end; 卸载服务: procedure UninstallService(ServiceName: pchar); var SCManager: SC_HANDLE; Service: SC_HANDLE; begin SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCManager = 0 then Exit; try Service := OpenService(SCManager, ServiceName, SERVICE_ALL_ACCESS); ControlService(Service, SERVICE_CONTROL_STOP, Status); DeleteService(Service); CloseServiceHandle(Service); finally CloseServiceHandle(SCManager); end; end; 安装服务: procedure InstallService(ServiceName, DisplayName: pchar; FileName: string); var SCManager: SC_HANDLE; Service: SC_HANDLE; Args: pchar; begin SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if SCManager = 0 then Exit; try Service := CreateService(SCManager, ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, pchar(FileName), nil, nil, nil, nil, nil); Args := nil; StartService(Service, 0, Args); CloseServiceHandle(Service); finally CloseServiceHandle(SCManager); end; end; 服务程序入口代码: ServiceName := pchar('获取服务程序路径'); if ParamStr(1) = '/i' then begin InstallService(ServiceName, '', ParamStr(0)); end else if ParamStr(1) = '/u' then begin UninstallService(ServiceName); end else begin ServiceTable[0].lpServiceName := ServiceName; ServiceTable[0].lpServiceProc := @ServiceCtrlDispatcher; ServiceTable[1].lpServiceName := nil; ServiceTable[1].lpServiceProc := nil; StartServiceCtrlDispatcher(ServiceTable[0]); end;
相关文章推荐
- Delphi如何获取系统服务(即Service服务程序)列表
- Delphi如何获取系统服务(即Service服务程序)列表
- 如何删除 MOSS 共享服务提供程序 (SSP, Shared Service Provider)
- Delphi编写系统服务四:如何限制系统服务和桌面程序只运行一个
- Delphi编写系统服务四:如何限制系统服务和桌面程序只运行一个
- 如何用 Delphi 创建系统服务程序?
- 如何删除 MOSS 共享服务提供程序 (SSP, Shared Service Provider)
- 如何用 Delphi 创建系统服务程序?
- 针对小程序参数二维码,HotApp小程序统计已提供二维码精准统计服务
- 《Windows小应用》如何将一个自己download的zip文件安装的程序添加到系统服务中
- Android 6.0 如何添加完整的系统服务(app-framework-kernel)
- 如何把apache和nginx 加入到系统服务,用service 命令来控制启动、停止
- 如何将程序注册系统服务
- 如何将程序添加到系统服务实现开机自启动
- android中getSystemService通过系统提供的Manager接口来访问及设置服务数据
- 用 Delphi 创建服务程序(Service)
- Delphi编写系统服务一:如何编写一个系统服务
- 如何在服务(Service)程序中显示对话框
- delphi创建具有托盘的服务程序(service)
- 谷歌地图服务Google Map Service 如何使用HTTP而不用HTTPS