Delphi写的Win32服务,怎么添加描述信息?

用Delphi写Win32服务很方便,它所提供的TService类很好用.但是使用过的朋友一定也发现,TService只提供了Name(服务名)和DisplayName(显示名)这两个属性,而并没有关于描述信息的属性可用.导致这样写出来的服务的描述信息是空的,总会让人觉得残缺不完整.

下面就说说给TService添加服务描述信息的方法.其它不多说,直接帖代码出来,下面帖出一个比较完整的服务单元,并且实现了服务描述信息的制定.

unit SvcMain; interface uses Windows, Classes, SvcMgr; const // 服务描述信息 SVC_DESC = 'This is the description of my service.'; type TMySvc = class(TService) procedure ServiceCreate(Sender: TObject); procedure ServiceDestroy(Sender: TObject); procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceContinue(Sender: TService; var Continued: Boolean); procedure ServiceAfterInstall(Sender: TService); private procedure SetDescription(const Desc: string); public function GetServiceController: TServiceController; override; end; var MySvc: TMySvc; implementation {$R *.DFM} uses WinSvc; procedure ServiceController(CtrlCode: DWORD); stdcall; begin MySvc.Controller(CtrlCode); end; function TMySvc.GetServiceController: TServiceController; begin Result := ServiceController; end; // 创建 procedure TMySvc.ServiceCreate(Sender: TObject); begin // TODO: end; // 销毁 procedure TMySvc.ServiceDestroy(Sender: TObject); begin // TODO: end; // 启动 procedure TMySvc.ServiceStart(Sender: TService; var Started: Boolean); begin Started := True; // TODO: // 开始你的工作 end; // 停止 procedure TMySvc.ServiceStop(Sender: TService; var Stopped: Boolean); begin Stopped := True; // TODO: // 停止你的工作 end; // 暂停 procedure TMySvc.ServicePause(Sender: TService; var Paused: Boolean); begin Paused := True; // TODO: // 暂停你的工作 end; // 继续 procedure TMySvc.ServiceContinue(Sender: TService; var Continued: Boolean); begin Continued := True; // TODO: // 继续你的工作 end; // 安装后 procedure TMySvc.ServiceAfterInstall(Sender: TService); begin // 设置描述信息 Self.SetDescription(SVC_DESC); end; {----------------------------------------------------- 名称: TMySvc.SetDescription 功能: 手动设置服务描述信息 参数: Desc: string - 描述信息 返回: 建议在 Afterinstall 事件中调用 -----------------------------------------------------} procedure TMySvc.SetDescription(const Desc: string); var hSCM: SC_HANDLE; hService: SC_HANDLE; sd: SERVICE_DESCRIPTION; begin hSCM := WinSvc.OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if hSCM = 0 then Exit; hService := WinSvc.OpenService(hSCM, PChar(Self.Name), SERVICE_CHANGE_CONFIG); if hService = 0 then Exit; sd.lpDescription := PChar(Desc); ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, @sd); // 说明: ChangeServiceConfig2 函数在 Delphi 的 WinSvc 单元中并没有提供, // 请自行参考 MSDN 对它进行声明定义和引用. 这不是此文的重点, 就不多说它. WinSvc.CloseServiceHandle(hService); WinSvc.CloseServiceHandle(hSCM); end; end.

当然,通过以上代码,还可以再进一步,从TService继承制作一个支持描述属性的服务封装类.留给有兴趣的朋友去做吧.

你可能感兴趣的:(Delphi写的Win32服务,怎么添加描述信息?)