用delphi7编写windows服务程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用delphi7编写windows服务程序总结

一、服务程序的创建

delphi编写服务程序非常简单,点击菜单File->New->Other->New属性页->Service Application,系统自动会创建基本的代码。这里需要说明的是,在“New属性页”中还有一个Service,这个Service和Service Application还是有区别的,应该说Service Application的范围大,它可以包含几个Service。

一个Service Application可以创建几个Service,service继承自TService,界面表现和TDataModel类似,做过数据库的朋友肯定都不陌生,区别是TDataModel是用来放数据库连接及操作组件的容器,而TService则是可以存放很多没有界面的组件,如indy的IDtcpclient等。

二、重要属性及事件说明

属性:DisplayName 显示名称

Name 名称,当你用命令提示符来启动、停止服务时,就需要用到

Interactive 与界面交互的选项

事件:OnCreate:类似于Tform的OnCreate

OnDestroy:类似于Tform的OnDestroy

OnExecute:非常重要,一般写成下面

while not Terminated do

begin

Sleep(10);

ServiceThread.ProcessRequests(False);

end;

OnPause:服务暂停

OnShutdown:不太清楚

OnStart:服务启动,重要

OnStop:服务停止,重要

三、服务的依赖关系

因为我的服务是要连接数据库的,所以必须要等sql server的服务起来之后,我才能起来,这样才能连接数据库,因此这里面有个依赖关系的问题。可以在属性Dependencies 中增加一项,选择MSSQLSERVER。

四、服务与界面的通讯

服务也是可以创建form的,只是只是这个窗口,在服务启动时显示,服务停止后就关闭了。而我想做一个就象sql server 2000的服务管理器哪样的界面,不论服务启动是否,都可以显示,而且也可以在界面上直接控制服务。所以我就又建了一个应用,而这个应用和原来服务的通讯用自定义消息来传递。比如,有人通过控制面板停止服务了,服务必须通知界面上的状态。

Delphi获取Windows系统服务的状态

function ServiceGetStatus(sMachine, sService: string ): DWord;

var

schm, schs: SC_Handle;

ss: TServiceStatus;

dwStat : DWord;

begin

dwStat := 0;

schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);

if (schm > 0) then

begin

schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STA TUS);

if(schs > 0) then

begin

if(QueryServiceStatus(schs, ss))then dwStat := ss.dwCurrentState;

CloseServiceHandle(schs);

end;

CloseServiceHandle(schm);

end;

Result := dwStat;

end;

{判断某服务是否安装,未安装返回true,已安装返回false} function ServiceUninstalled(sMachine, sService : string ) : boolean; begin

Result := 0 = ServiceGetStatus(sMachine, sService);

end;

{判断某服务是否启动,启动返回true,未启动返回false}

function ServiceRunning(sMachine, sService : string ) : boolean;

begin

Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService ); end;

{判断某服务是否停止,停止返回true,未停止返回false}

function ServiceStopped(sMachine, sService : string ) : boolean;

begin

Result := SERVICE_STOPPED = ServiceGetStatus(sMachine, sService );

end;

Delphi 如何停止、启动windows系统服务

//下面是写了一个启动服务的函数StartService,用来启动服务。。。

function StartService(AServName: string): Boolean; //use WinSvc

var

SCManager, hService: SC_HANDLE;

lpServiceArgVectors: PChar;

begin

SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);

Result := SCManager <> 0;

if Result then

try

hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS); Result := hService <> 0;

if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then Exception.Create('The specified service does not exist');

if hService <> 0 then

try

lpServiceArgVectors := nil;

Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));

if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then Result := True;

相关文档
最新文档