关于windows服务的编程方法Word格式文档下载.docx

上传人:b****5 文档编号:15758465 上传时间:2022-11-15 格式:DOCX 页数:25 大小:25.47KB
下载 相关 举报
关于windows服务的编程方法Word格式文档下载.docx_第1页
第1页 / 共25页
关于windows服务的编程方法Word格式文档下载.docx_第2页
第2页 / 共25页
关于windows服务的编程方法Word格式文档下载.docx_第3页
第3页 / 共25页
关于windows服务的编程方法Word格式文档下载.docx_第4页
第4页 / 共25页
关于windows服务的编程方法Word格式文档下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

关于windows服务的编程方法Word格式文档下载.docx

《关于windows服务的编程方法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《关于windows服务的编程方法Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。

关于windows服务的编程方法Word格式文档下载.docx

许多FTP、WWW服务器和数据库就是以Service的形式存在于WIN2000上,从而实现了无人值守。

就连最新版的"

黑客"

程序BackOrifice2000也是以Service形式在WIN2000上藏身的。

由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步。

鉴于此,下面我们就从头到尾来构造一个全新的Service,读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service。

在编写Service之前,先介绍一下几个重要的函数:

1.

SC_HANDLEOpenSCManager(LPCTSTRlpMachineName,

LPCTSTRlpDatabaseName,DWORDdwDesiredAccess)

OpenSCManager函数打开指定计算机上的servicecontrolmanagerdatabase。

其中参数lpMachineName指定计算机名,若为空则指定为本机。

LpDatabaseName为指

定要打开的servicecontrolmanagerdatabase名,默认为空。

dwDesiredAccess指定

操作的权限,可以为下面取值之一:

SC_MANAGER_ALL_ACCESS//所有权限

SC_MANAGER_CONNECT//允许连接到servicecontrolmanagerdatabase

SC_MANAGER_CREATE_SERVICE//允许创建服务对象并把它加入database

SC_MANAGER_ENUMERATE_SERVICE//允许枚举database中的Service

SC_MANAGER_LOCK//允许锁住database

SC_MANAGER_QUERY_LOCK_STATUS//允许查询database的封锁信息

函数执行成功则返回一个指向servicecontrolmanagerdatabase的句柄,失败则返回NULL。

注意:

WIN2000通过一个名为servicecontrolmanagerdatabase的数据库来管理所有的Service,因此对Service的任何操作都应打开此数据库。

2.

SC_HANDLECreateService(SC_HANDLEhSCManager,

LPCTSTRlpServiceName,

LPCTSTRlpDisplayName,

DWORDdwDesiredAccess,

DWORDdwServiceType,

DWORDdwStartType,

DWORDdwErrorControl,

LPCTSTRlpBinaryPathName,

LPCTSTRlpLoadOrderGroup,

LPDWORDlpdwTagId,

LPCTSTRlpDependencies,

LPCTSTRlpServiceStartName,

LPCTSTRlpPassword)

CreatService函数产生一个新的SERVICE。

其中参数hSCManager为指向servicecontrolmanagerdatabase的句柄,由OpenSCManager返回。

LpServiceName为SERVICE的名字,lpDisplayName为Service显示用名,dwDesiredAccess是访问权限,本程序中用SERVICE_ALL_ACCESS。

wServiceType,指明SERVICE类型,本程序中用SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS。

dwStartType为Service启动方式,本程序采用自启动,即dwStartType等于SERVICE_AUTO_START。

dwErrorControl说明当Service在启动中出错时采取什么动作,本程序采用SERVICE_ERROR_IGNORE即忽约错误,读者可以改为其他的。

LpBinaryPathName指明Service本体程序的路径名。

剩下的五个参数一般可设为NULL。

如函数调用成功则返回这个新Service的句柄,失败则返回NULL。

与此函数对应的是DeleteService(hService),它删除指定的Service。

3.

SC_HANDLEOpenService(SC_HANDLEhSCManager,LPCTSTRlpServiceName,DWORDdwDesiredAccess)

OpenService函数打开指定的Service。

LpServiceName为Service的名字,dwDesiredAccess是访问权限,其可选值比较多,读者可以参看SDKHelp.函数调用成功则返回打开的Service句柄,失败则返回NULL。

4.

BOOLStartService(SC_HANDLEhService,DWORDdwNumServiceArgs,LPCTSTR*lpServiceArgVectors)

StartService函数启动指定的Service。

其中参数hService为指向Service的句柄,由OpenService返回。

dwNumServiceAr为启动服务所需的参数的个数。

lpszServiceArgs为启动服务所需的参数。

函数执行成功则返回True,失败则返回False。

5.

BOOLControlService(SC_HANDLEhServiceDWORDdwControl,LPSERVICE_STATUSlpServiceStatus)

Service程序没有专门的停止函数,而是用ControlService函数来控制Service的暂停、继续、停止等操

作。

参数dwControl指定发出的控制命令,可以为以下几个值:

SERVICE_CONTROL_STOP//停止Service

SERVICE_CONTROL_PAUSE//暂停Service

SERVICE_CONTROL_CONTINUE//继续Service

SERVICE_CONTROL_INTERROGATE//查询Service的状态

SERVICE_CONTROL_SHUTDOWN//让ControlService调用失效

参数lpServiceStatus是一个指向SERVICE_STATUS的指针。

SERVICE_STATUS是一个比较重要的结构,它包含了Service的各种信息,如当前状态、可接受何种控制命令等等。

6.

BOOLQueryServiceStatus(SC_HANDLEhService,LPSERVICE_STATUSlpServiceStatus)

QueryServiceStatus函数比较简单,它查询并返回当前Service的状态。

编制一个Service一般需要两个程序,一个是Service本体,一个是用于对Service进行控制的控制程序。

通常Service本体是一个console程序,而控制程序则是一个普通的Win32应用程序(当然,用户不用控制程序而通过控制面板也可对Service进行启、停,但不能进行添加、删除操作。

首先,我们来编写Service本体。

对于Service本体来说,它一般又由以下三部分组成:

main()、ServiceMain()、Handler(),下面是main()的源代码:

(注:

由于篇幅的关系,大部分程序都没进行错误处理,读者可以自己添上)

intmain(intargc,char**argv)

{

SERVICE_TABLE_ENTRYste[2];

//一个Service进程可以有多个线程,这是每个    

//线程的入口表

ste[0].lpServiceName="

W.Z.SERVICE"

;

//线程名字

ste[0].lpServiceProc=ServiceMain;

//线程入口地址

ste[1].lpServiceName=NULL;

//最后一个必须为NULL

ste[1].lpServiceProc=NULL;

StartServiceCtrlDispatcher(ste);

return0;

}

main()是Service的主线程。

当serviecontrolmanager开始一个Service进程时,它总是等待这个Service去调用StartServiceCtrlDispatcher()函数。

main()作为这个进程的主线程应该在程序开始后尽快调用StartServiceCtrlDispatcher()。

StartServiceCtrlDispatcher()在被调用后并不立即返回,它把本Service的主线程连接到servicecontrolmanager,从而让servicecontrolmanager通过这个连接发送开始、停止等控制命令给主线程。

主线程在这时就扮演了一个命令的转发器的角色,它或者调用Handle()去处理停止、继续等控制要求,或者产生一个新线程去执行ServiceMain。

StartServiceCtrlDispatcher()在整个Service结束时才返回。

ServiceMain()是Service真正的入口点,必须在main()中进行了正确的定义。

ServiceMain()的两个参数是由StartService()传递过来的。

下面是ServiceMain()的源代码:

voidWINAPIServiceMain(DWORDdwArgc,LPTSTR*lpszArgv)

ssh=RegisterServiceCtrlHandler

("

Handler);

ss.dwServiceType=SERVICE_WIN32_OWN

_PROCESS|SERVICE_INTERACTIVE_PROCESS;

ss.dwCurrentState=SERVICE_START_PENDING;

//如用户程序的代码比较多

(执行时间超过1秒),这儿要设成SERVICE_

START_PENDING,待用户程序完成后再设为SERVICE_RUNNING。

ss.dwControlsAccepted=SERVICE_ACCEPT_

STOP;

//表明Service目前能接受的命令是停止命令。

ss.dwWin32ExitCode=NO_ERROR;

ss.dwCheckPoint=0;

ss.dwWaitHint=0;

SetServiceStatus(ssh,&

ss);

//必须随时更新数据库中Service的状态。

Mycode();

//这儿可

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1