ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:25.47KB ,
资源ID:2847404      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2847404.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于windows服务的编程方法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

关于windows服务的编程方法.docx

1、关于windows服务的编程方法Quote 1:C+Builder在WIN2000环境下编制Service 发布时间:2006.04.07 01:20 来源:赛迪网社区作者:kkWindows 2000与Windows 9x有一个非常重要的区别,即Windows 2000提供了很多功能强大的Service(服务)。这些Service可以随着WIN2000的启动而自启动,也可以让用户通过控制面板启动,还可以被Win32应用程序起停。甚至在没有用户登录系统的情况下,这些Service也能执行。许多FTP、WWW服务器和数据库就是以Service的形式存在于WIN2000上,从而实现了无人值守。就连

2、最新版的黑客程序Back Orifice 2000也是以Service形式在WIN2000上藏身的。由于Service的编程较复杂,许多开发者想开发自己的Service但往往都望而却步。鉴于此,下面我们就从头到尾来构造一个全新的Service,读者只要在程序中注明的地方加上自己的代码,那么就可以轻松拥有一个自己的Service。在编写Service之前,先介绍一下几个重要的函数: 1. SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)OpenSCManag

3、er 函数打开指定计算机上的service control manager database。 其中参数lpMachineName指定计算机名,若为空则指定为本机。LpDatabaseName为指 定要打开的service control manager database名, 默认为空。dwDesiredAccess指定 操作的权限, 可以为下面取值之一:SC_MANAGER_ALL_ACCESS /所有权限SC_MANAGER_CONNECT /允许连接到service control manager databaseSC_MANAGER_CREATE_SERVICE /允许创建服务对象并把

4、它加入databaseSC_MANAGER_ENUMERATE_SERVICE /允许枚举database 中的ServiceSC_MANAGER_LOCK /允许锁住databaseSC_MANAGER_QUERY_LOCK_STATUS /允许查询database的封锁信息函数执行成功则返回一个指向service control manager database的句柄,失败则返回NULL。注意:WIN2000通过一个名为service control manager database的数据库来管理所有的Service,因此对Service的任何操作都应打开此数据库。 2. SC_HANDL

5、E CreateService(SC_HANDLE hSCManager,LPCTSTR lpServiceName,LPCTSTR lpDisplayName,DWORD dwDesiredAccess,DWORD dwServiceType,DWORD dwStartType,DWORD dwErrorControl,LPCTSTR lpBinaryPathName,LPCTSTR lpLoadOrderGroup,LPDWORD lpdwTagId,LPCTSTR lpDependencies,LPCTSTR lpServiceStartName,LPCTSTR lpPassword)C

6、reatService函数产生一个新的SERVICE。其中参数hSCManager为指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName为SERVICE的名字,lpDisplayName为Service显示用名,dwDesiredAccess是访问权限,本程序中用SERVICE_ALL_ACCESS。wServiceType,指明SERVICE类型,本程序中用SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS。dwStartType为Service启动

7、方式,本程序采用自启动,即dwStartType等于SERVICE_AUTO_START。 dwErrorControl说明当Service在启动中出错时采取什么动作,本程序采用SERVICE_ERROR_IGNORE即忽约错误,读者可以改为其他的。LpBinaryPathName指明Service本体程序的路径名。剩下的五个参数一般可设为NULL。如函数调用成功则返回这个新Service的句柄,失败则返回NULL。与此函数对应的是DeleteService( hService),它删除指定的Service。 3. SC_HANDLE OpenService(SC_HANDLE hSCMana

8、ger,LPCTSTR lpServiceName, DWORD dwDesiredAccess )OpenService函数打开指定的Service。其中参数hSCManager为指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName为Service的名字,dwDesiredAccess是访问权限,其可选值比较多,读者可以参看SDK Help. 函数调用成功则返回打开的Service句柄,失败则返回NULL。 4. BOOL StartService( SC_HANDLE hService, DWORD dw

9、NumServiceArgs,LPCTSTR *lpServiceArgVectors )StartService函数启动指定的Service。其中参数hService 为指向Service的句柄,由OpenService返回。dwNumServiceAr为启动服务所需的参数的个数。lpszServiceArgs 为 启 动 服务所需的参数。函数执行成功则返回True, 失败则返回False。 5. BOOL ControlService(SC_HANDLE hService DWORD dwControl,LPSERVICE_STATUS lpServiceStatus )Service程序

10、没有专门的停止函数,而是用ControlService函数来控制Service的暂停、继续、停止等操 作。参数dwControl指定发出的控制命令,可以为以下几个值: SERVICE_CONTROL_STOP /停止ServiceSERVICE_CONTROL_PAUSE /暂停ServiceSERVICE_CONTROL_CONTINUE /继续ServiceSERVICE_CONTROL_INTERROGATE /查询Service的状态SERVICE_CONTROL_SHUTDOWN /让ControlService调用失效参数lpServiceStatus是一个指向SERVICE_ST

11、ATUS的指针。SERVICE_STATUS是一个比较重要的结构,它包含了Service的各种信息,如当前状态、可接受何种控制命令等等。 6. BOOL QueryServiceStatus( SC_HANDLE hService,LPSERVICE_STATUS lpServiceStatus )QueryServiceStatus函数比较简单,它查询并返回当前Service的状态。 编制一个Service一般需要两个程序,一个是Service本体,一个是用于对Service进行控制的控制程序。通常Service本体是一个console程序,而控制程序则是一个普通的Win32应用程序(当然,

12、用户不用控制程序而通过控制面板也可对Service进行启、停,但不能进行添加、删除操作。) 首先,我们来编写Service本体。对于Service本体来说,它一般又由以下三部分组成:main()、ServiceMain()、Handler(),下面是main()的源代码:(注:由于篇幅的关系,大部分程序都没进行错误处理,读者可以自己添上) int main(int argc, char *argv)SERVICE_TABLE_ENTRY ste2;/一个Service进程可以有多个线程,这是每个/线程的入口表ste0.lpServiceName=W.Z.SERVICE; /线程名字ste0.l

13、pServiceProc=ServiceMain;/线程入口地址ste1.lpServiceName=NULL;/最后一个必须为NULLste1.lpServiceProc=NULL;StartServiceCtrlDispatcher(ste);return 0;main()是Service的主线程。当servie control manager开始一个Service进程时,它总是等待这个Service去调用StartServiceCtrlDispatcher()函数。main( )作为这个进程的主线程应该在程序开始后尽快调用StartServiceCtrlDispatcher()。Star

14、tServiceCtrlDispatcher()在被调用后并不立即返回,它把本Service的主线程连接到service control manager,从而让service control manager通过这个连接发送开始、停止等控制命令给主线程。主线程在这时就扮演了一个命令的转发器的角色,它或者调用Handle( )去处理停止、继续等控制要求,或者产生一个新线程去执行ServiceMain。StartServiceCtrlDispatcher()在整个Service结束时才返回。 ServiceMain()是Service真正的入口点,必须在main()中进行了正确的定义。Service

15、Main( )的两个参数是由StartService()传递过来的。下面是ServiceMain()的源代码: void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)ssh=RegisterServiceCtrlHandler(W.Z.SERVICE,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