您的位置:首页 > 编程语言 > Delphi

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

2009-06-25 11:26 393 查看
用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继承制作一个支持描述属性的服务封装类.留给有兴趣的朋友去做吧.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: