使用DELPHI 在windwos 及NT 上服务注册的具体实现.docx
《使用DELPHI 在windwos 及NT 上服务注册的具体实现.docx》由会员分享,可在线阅读,更多相关《使用DELPHI 在windwos 及NT 上服务注册的具体实现.docx(17页珍藏版)》请在冰豆网上搜索。
使用DELPHI在windwos及NT上服务注册的具体实现
使用DELPHI在windwos2000及NT上服务注册的具体实现
{**************************************************************}
{*******************************************************}
{*程序编写:
陈林茂
{*编写日期:
2003-01-05
{*联系作者:
linmaochen@
{*******************************************************}
interface
uses
Windows,Classes,SysUtils,Winsvc,nb30,winsock;
Type
{服务句柄信息}
TScmInfo=Record
HostName:
String;
DataBaseName:
String;
DesireAccess:
DWORD;
End;
{服务信息}
TSvcInfo=Record
HscManager:
Integer;
ServerName:
String;//服务名
DisplayName:
String;//服务的显示名
DesireAccess:
DWORD;//
ServiceType:
Dword;//服务的类别
StartType:
Dword;//服务的启动方式
ErrorControl:
Dword;//服务错误控制方式
BinaryPathName:
String;//服务执行文件的具体路径
LoadOrderGroup:
String;
TagId:
Dword;
Dependencies:
String;//依赖:
有多个依赖的服务时,中间以空格隔开}
ServerStartName:
String;
Password:
String;
End;
//需要注册的服务信息数组
SvcArray=Array[1..20]ofTSvcInfo;
Type
{服务控制类}
TService=Class(TObject)
Private
Scm_Info:
TScmInfo;
Svc_Info:
TSvcInfo;
ScmHandle:
Integer;
{服务句柄}
SvcHandle:
Integer;
Public
ConstructorCreate();
DestructorDestroy();Override;
FunctionSetScmInfo():
Boolean;
FunctionOpenScmHandle():
Integer;
FunctionSetServiceInfo(TmpSvc:
TsvcInfo):
Boolean;
FunctionCreateService():
Boolean;
{删除一服务}
FunctionDelete_AService(ServiceName:
String):
Boolean;
{建立一服务}
FunctionOpen_Service(ServiceName:
String):
Boolean;
{/////////////////////////////////////////////////////////////////////}
{//函数名称:
IsSvcExists()
{//函数功能:
判断系统中相关的服务是否存在
{//参数信息:
需要判断的服务名
{//返回值:
TRUE:
WINDOWS中的服务已存在,FALSE:
WINDOWS中的服务不存在
{//
{/////////////////////////////////////////////////////////////////////}
FunctionisSvcExists(ServiceName:
string):
Boolean;
{/////////////////////////////////////////////////////////////////////////}
{//函数名称:
Start_Service()
{//函数功能:
启动相关的服务进程
{//参数信息:
需要启动的服务名
{//返回值:
TRUE:
服务已经启动;FALSE:
服务启动失败;
{/////////////////////////////////////////////////////////////////////////}
FunctionControl_Service(ServiceName:
String;controlType:
integer):
Boolean;
{/////////////////////////////////////////////////////////////////////////}
{//函数名称:
IsServiceStart()
{//函数功能:
判断服务是否启动
{//参数信息:
需要判断的服务名
{//返回值:
TRUE:
服务已经启动;FALSE:
服务已停止
{/////////////////////////////////////////////////////////////////////////}
FunctionIsServiceStart(ServiceName:
String):
Boolean;
End;
implementation
{TService}
constructorTService.Create;
begin
try
ScmHandle:
=0;
SetScmInfo();
ScmHandle:
=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
Except
End;
end;Top
{建立一服务}
functionTService.CreateService():
Boolean;
Var
i:
Integer;
begin
Try
OpenScmHandle();
svc_info.HscManager:
=ScmHandle;
Result:
=False;
SvcHandle:
=CreateService(svc_Info.HscManager,Pchar(svc_Info.ServerName),Pchar(Svc_Info.DisplayName),Svc_info.DesireAccess,
svc_INfo.ServiceType,Svc_Info.StartType,Svc_Info.ErrorControl,pchar(Svc_Info.BinaryPathName),
pchar(''),LPDWORD(0),Pchar(Svc_Info.Dependencies),Pchar(Svc_info.ServerStartName),Pchar(Svc_Info.Password));
IfSvcHandle<>0Then
Begin
Result:
=True;
CloseServiceHandle(SvcHandle);
End;
I:
=i+1;
Except
End;
end;
{注销一服务}
functionTService.Delete_AService(ServiceName:
String):
Boolean;
Var
RHandle:
Integer;
rc:
Boolean;
begin
Try
OpenScmHandle();
Result:
=False;
IfScmHandle<>0Then
Begin
RHandle:
=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS);
IfRHandle<>0Then
Begin
Rc:
=DeleteService(Rhandle);
Result:
=Rc;
{关闭句柄}
CloseServiceHandle(RHandle);
EndElseResult:
=True;
End;
Except
End;
end;
destructorTService.Destroy;
begin
try
CloseServiceHandle(ScmHandle);
Except
End;
end;
{打开数据库的句柄}
functionTService.isSvcExists(ServiceName:
string):
Boolean;
Var
RHandle:
Integer;
rc:
Boolean;
begin
Try
OpenScmHandle();
Result:
=False;
IfScmHandle<>0Then
Begin
RHandle:
=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS);
IfRHandle<>0Then
Begin
Result:
=true;
{关闭句柄}
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
functionTService.OpenScmHandle:
Integer;
begin
try
SetScmInfo();
ifScmHandle<>0ThenCloseServiceHandle(ScmHandle);
ScmHandle:
=0;
ScmHandle:
=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
ifScmHandle=0then
ScmHandle:
=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
Except
End;
end;
{打开一服务}
functionTService.Open_Service(ServiceName:
String):
Boolean;
Var
SHandle:
Integer;
begin
Try
Result:
=False;
sHandle:
=0;
SHandle:
=OpenScmHandle();
IfSHandle<>0Then
Begin
SvcHandle:
=OpenService(SHandle,PChar(ServiceName),SERVICE_ALL_ACCESS);
IfSvcHandle<>0ThenResult:
=True;
End;
Except
End;
end;
functionTService.SetScmInfo():
Boolean;
Var
hostName:
array[0..255]ofchar;
wsdata:
TWSAData;
begin
try
WSAStartup($0101,wsdata);
Result:
=False;
gethostname(hostName,sizeof(hostName));
IfHostName=''Then
Exit;
scm_Info.HostName:
=HostName;
Scm_Info.DesireAccess:
=SC_MANAGER_ALL_ACCESS;
Except
End;
end;
//设置需要注册的WINDOWS服务的具体信息
functionTService.SetServiceInfo(TmpSvc:
TsvcInfo):
Boolean;
begin
try
Result:
=False;
IfScmHandle>0Then
Begin
Svc_Info:
=TmpSvc;
Svc_Info.HscManager:
=ScmHandle;
Result:
=True;
End;
Except
End;
end;
//控制WINDOWS系统内部的服务
functionTService.Control_Service(ServiceName:
String;controlType:
Integer):
Boolean;
Var
RHandle:
Integer;
rc:
Boolean;
Rec_status:
TServiceStatus;
serviceArg:
Pchar;
i:
Integer;
begin
i:
=0;
serviceArg:
=Pchar('');
Try
Result:
=False;
IfScmHandle<>0Then
Begin
RHandle:
=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS);
IfRHandle<>0Then
Begin
CasecontrolTypeof
1:
//启动服务器
Begin
//ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
StartService(rHandle,0,servicearg);
i:
=0;
Whilei<30Do
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_RUNNINGthen
Begin
result:
=True;
CloseServiceHandle(RHandle);
Break;
End;
sleep(1000);
i:
=i+1;
End;
End;
2:
//暂停服务进程
Begin
ControlService(rHandle,SERVICE_CONTROL_PAUSE,rec_status);
i:
=0;
Whilei<30Do
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_PAUSEDthen
Begin
result:
=true;
CloseServiceHandle(RHandle);
Break;
End;
Sleep(1000);
i:
=i+1;
End;
End;
3:
//唤醒服务进程
Begin
ControlService(rHandle,SERVICE_CONTROL_CONTINUE,rec_status);
i:
=0;
Whilei<30do
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_RUNNINGthen
Begin
result:
=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep(1000);
i:
=i+1;
End;
End;
4:
//停止服务进程
begin
ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
i:
=0;
Whilei<30Do
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_STOPPEDthen
Begin
result:
=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep(1000);
i:
=i+1;
End;
End;
5:
//关闭服务程序SERVICE_CONTROL_SHUTDOWN
Begin
rec_status.dwCurrentState:
=SERVICE_RUNNING;
ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
i:
=0;
Whilei<30Do
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_STOPPEDthen
Begin
result:
=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep(1000);
i:
=i+1;
End;
End;
end;
Result:
=true;
{关闭句柄}
ifrHandle<>0then
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
functionTService.IsServiceStart(ServiceName:
String):
Boolean;
Var
RHandle:
Integer;
rc:
Boolean;
Rec_status:
TServiceStatus;
begin
Try
OpenScmHandle();
Result:
=False;
IfScmHandle<>0Then
Begin
RHandle:
=0;
RHandle:
=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS);
IfRHandle<>0Then
Begin
QueryServiceStatus(RHandle,Rec_status);
ifrec_status.dwCurrentState=SERVICE_RUNNINGthen
result:
=True;
{关闭句柄}
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
end.