用delphi7编写windows服务程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;